Files
forms/scripts/init_db_with_create.py
2026-04-09 19:28:41 +03:00

93 lines
3.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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)