Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Исправлены критические ошибки callback обработки - Реализована модульная архитектура с применением SOLID принципов - Добавлена система dependency injection - Создана новая структура: interfaces, repositories, components, controllers - Исправлены проблемы с базой данных (добавлены отсутствующие столбцы) - Заменены заглушки на полную функциональность управления розыгрышами - Добавлены отчеты о проделанной работе и документация Архитектура готова для production и легко масштабируется
118 lines
4.8 KiB
Python
118 lines
4.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Исправление схемы базы данных
|
|
Добавление недостающих полей в таблицу users
|
|
"""
|
|
|
|
import asyncio
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
|
|
from src.core.database import engine
|
|
from sqlalchemy import text
|
|
|
|
async def fix_database_schema():
|
|
"""Добавление недостающих полей в базу данных"""
|
|
print("🔧 Исправляем схему базы данных...")
|
|
|
|
async with engine.begin() as conn:
|
|
|
|
# Проверяем, есть ли поле phone
|
|
result = await conn.execute(text(
|
|
"SELECT column_name FROM information_schema.columns "
|
|
"WHERE table_name = 'users' AND column_name = 'phone'"
|
|
))
|
|
|
|
if not result.fetchone():
|
|
print("📞 Добавляем поле 'phone'...")
|
|
await conn.execute(text(
|
|
"ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL"
|
|
))
|
|
print("✅ Поле 'phone' добавлено")
|
|
else:
|
|
print("✅ Поле 'phone' уже существует")
|
|
|
|
# Проверяем, есть ли поле club_card_number
|
|
result = await conn.execute(text(
|
|
"SELECT column_name FROM information_schema.columns "
|
|
"WHERE table_name = 'users' AND column_name = 'club_card_number'"
|
|
))
|
|
|
|
if not result.fetchone():
|
|
print("💳 Добавляем поле 'club_card_number'...")
|
|
await conn.execute(text(
|
|
"ALTER TABLE users ADD COLUMN club_card_number VARCHAR(50) NULL"
|
|
))
|
|
await conn.execute(text(
|
|
"CREATE UNIQUE INDEX ix_users_club_card_number ON users (club_card_number)"
|
|
))
|
|
print("✅ Поле 'club_card_number' добавлено")
|
|
else:
|
|
print("✅ Поле 'club_card_number' уже существует")
|
|
|
|
# Проверяем, есть ли поле is_registered
|
|
result = await conn.execute(text(
|
|
"SELECT column_name FROM information_schema.columns "
|
|
"WHERE table_name = 'users' AND column_name = 'is_registered'"
|
|
))
|
|
|
|
if not result.fetchone():
|
|
print("📝 Добавляем поле 'is_registered'...")
|
|
await conn.execute(text(
|
|
"ALTER TABLE users ADD COLUMN is_registered BOOLEAN DEFAULT FALSE NOT NULL"
|
|
))
|
|
print("✅ Поле 'is_registered' добавлено")
|
|
else:
|
|
print("✅ Поле 'is_registered' уже существует")
|
|
|
|
# Проверяем, есть ли поле verification_code
|
|
result = await conn.execute(text(
|
|
"SELECT column_name FROM information_schema.columns "
|
|
"WHERE table_name = 'users' AND column_name = 'verification_code'"
|
|
))
|
|
|
|
if not result.fetchone():
|
|
print("🔐 Добавляем поле 'verification_code'...")
|
|
await conn.execute(text(
|
|
"ALTER TABLE users ADD COLUMN verification_code VARCHAR(10) NULL"
|
|
))
|
|
await conn.execute(text(
|
|
"CREATE UNIQUE INDEX ix_users_verification_code ON users (verification_code)"
|
|
))
|
|
print("✅ Поле 'verification_code' добавлено")
|
|
else:
|
|
print("✅ Поле 'verification_code' уже существует")
|
|
|
|
# Удаляем поле account_number, если оно есть (оно перенесено в отдельную таблицу)
|
|
result = await conn.execute(text(
|
|
"SELECT column_name FROM information_schema.columns "
|
|
"WHERE table_name = 'users' AND column_name = 'account_number'"
|
|
))
|
|
|
|
if result.fetchone():
|
|
print("🗑️ Удаляем устаревшее поле 'account_number'...")
|
|
# Сначала удаляем индекс
|
|
try:
|
|
await conn.execute(text("DROP INDEX IF EXISTS ix_users_account_number"))
|
|
except:
|
|
pass
|
|
await conn.execute(text(
|
|
"ALTER TABLE users DROP COLUMN account_number"
|
|
))
|
|
print("✅ Поле 'account_number' удалено")
|
|
else:
|
|
print("✅ Поле 'account_number' уже удалено")
|
|
|
|
async def main():
|
|
"""Основная функция"""
|
|
try:
|
|
await fix_database_schema()
|
|
print("\n🎉 Схема базы данных успешно исправлена!")
|
|
except Exception as e:
|
|
print(f"❌ Ошибка при исправлении базы данных: {e}")
|
|
finally:
|
|
await engine.dispose()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main()) |