#!/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())