""" Управление сессиями базы данных Автор: Сергей Антропов Сайт: https://devops.org.ru """ from sqlalchemy import create_engine from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from sqlalchemy.orm import sessionmaker from app.core.config import settings from app.models.database import Base # Создание движка базы данных # Для SQLite используем sync движок, для PostgreSQL - async if settings.DATABASE_URL.startswith("sqlite"): # SQLite engine = create_engine( settings.DATABASE_URL.replace("sqlite:///", "sqlite:///"), connect_args={"check_same_thread": False} if "sqlite" in settings.DATABASE_URL else {} ) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) async_engine = None AsyncSessionLocal = None else: # PostgreSQL с asyncpg async_database_url = settings.DATABASE_URL.replace("postgresql://", "postgresql+asyncpg://") async_engine = create_async_engine( async_database_url, echo=False, future=True ) AsyncSessionLocal = async_sessionmaker( async_engine, class_=AsyncSession, expire_on_commit=False ) engine = None SessionLocal = None def init_db(): """Инициализация базы данных (создание таблиц через миграции)""" # Таблицы создаются через Alembic миграции # Здесь только проверяем подключение if engine: try: from app.models.user import Base as UserBase from app.models.database import Base as DatabaseBase # В продакшене используем миграции pass except Exception as e: import logging logging.getLogger(__name__).error(f"Ошибка инициализации БД: {e}") def get_db(): """Получение сессии базы данных (для sync)""" if SessionLocal is None: raise RuntimeError("Sync database not configured") db = SessionLocal() try: yield db finally: db.close() async def get_async_db(): """Получение async сессии базы данных""" if AsyncSessionLocal is None: raise RuntimeError("Async database not configured") async with AsyncSessionLocal() as session: yield session