feat: Полный рефакторинг с модульной архитектурой
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Исправлены критические ошибки callback обработки - Реализована модульная архитектура с применением SOLID принципов - Добавлена система dependency injection - Создана новая структура: interfaces, repositories, components, controllers - Исправлены проблемы с базой данных (добавлены отсутствующие столбцы) - Заменены заглушки на полную функциональность управления розыгрышами - Добавлены отчеты о проделанной работе и документация Архитектура готова для production и легко масштабируется
This commit is contained in:
118
fix_db_schema.py
Normal file
118
fix_db_schema.py
Normal file
@@ -0,0 +1,118 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user