from collections.abc import AsyncIterator from sqlalchemy.ext.asyncio import ( AsyncSession, async_sessionmaker, create_async_engine, ) from sqlalchemy.orm import DeclarativeBase from sqlalchemy.pool import NullPool from app.config import settings class Base(DeclarativeBase): pass engine_options: dict[str, object] = { "pool_pre_ping": True, } if not settings.database_url.startswith("sqlite"): engine_options.update( pool_size=settings.database_pool_size, max_overflow=settings.database_max_overflow, ) else: engine_options["poolclass"] = NullPool engine = create_async_engine(settings.database_url, **engine_options) SessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession) async def get_db() -> AsyncIterator[AsyncSession]: async with SessionLocal() as session: try: yield session except Exception: await session.rollback() raise