"""Подключение к Postgres. Асинхронный движок, одна фабрика сессий на процесс.""" from collections.abc import AsyncIterator from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.orm import DeclarativeBase from app.config import get_settings class Base(DeclarativeBase): """Общая база моделей. Alembic сравнивает миграции с `Base.metadata`.""" _engine = None _sessionmaker: async_sessionmaker[AsyncSession] | None = None def get_engine(): global _engine if _engine is None: _engine = create_async_engine(get_settings().database_url, pool_pre_ping=True) return _engine def get_sessionmaker() -> async_sessionmaker[AsyncSession]: global _sessionmaker if _sessionmaker is None: _sessionmaker = async_sessionmaker(get_engine(), expire_on_commit=False) return _sessionmaker async def get_session() -> AsyncIterator[AsyncSession]: """Зависимость FastAPI: сессия на запрос, коммит явный.""" async with get_sessionmaker()() as session: yield session