#!/usr/bin/env python """ Скрипт для инициализации базы данных с автоматическим созданием """ import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) from sqlalchemy import create_engine, text from sqlalchemy.exc import OperationalError from app.config import settings from app.models.base import Base import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def create_database_if_not_exists(): """Создает базу данных если она не существует""" # Подключаемся к default database (postgres) default_db_url = settings.DATABASE_URL.replace(f"/{settings.DB_NAME}", "/postgres") try: engine = create_engine(default_db_url, isolation_level="AUTOCOMMIT") with engine.connect() as conn: # Проверяем существует ли база result = conn.execute( text(f"SELECT 1 FROM pg_database WHERE datname = '{settings.DB_NAME}'") ) exists = result.fetchone() if not exists: logger.info(f"Creating database '{settings.DB_NAME}'...") conn.execute(text(f"CREATE DATABASE {settings.DB_NAME}")) logger.info(f"✅ Database '{settings.DB_NAME}' created successfully!") else: logger.info(f"✅ Database '{settings.DB_NAME}' already exists") engine.dispose() return True except Exception as e: logger.error(f"❌ Failed to create database: {e}") return False def init_database(): """Инициализация таблиц в БД""" try: # Сначала создаем БД если нужно if not create_database_if_not_exists(): logger.error("Cannot proceed without database") return False logger.info(f"Connecting to: {settings.DATABASE_URL}") # Создаем движок для основной БД engine = create_engine( settings.DATABASE_URL, echo=settings.DEBUG, pool_pre_ping=True, ) # Создаем таблицы logger.info("Creating database tables...") Base.metadata.create_all(bind=engine) logger.info("✅ Database tables created successfully!") # Проверяем созданные таблицы with engine.connect() as conn: result = conn.execute(text(""" SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name """)) tables = [row[0] for row in result] logger.info(f"Created tables: {', '.join(tables)}") engine.dispose() logger.info("Database initialization completed successfully!") return True except Exception as e: logger.error(f"❌ Failed to initialize database: {e}") raise if __name__ == "__main__": success = init_database() sys.exit(0 if success else 1)