"""Async SQLAlchemy engine, session factory, and request transaction boundary.""" from collections.abc import AsyncGenerator from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine from app.core.config import Settings, get_settings def create_database_engine(settings: Settings | None = None) -> AsyncEngine: resolved_settings = settings or get_settings() return create_async_engine(resolved_settings.database_url, pool_pre_ping=True) engine = create_database_engine() SessionFactory = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async def get_db_session() -> AsyncGenerator[AsyncSession, None]: async with SessionFactory() as session: try: yield session except Exception: await session.rollback() raise else: await session.commit()