from collections.abc import AsyncIterator from functools import lru_cache from sqlalchemy.ext.asyncio import ( AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine, ) from app.core.config import get_settings @lru_cache def get_engine() -> AsyncEngine: settings = get_settings() return create_async_engine( settings.database_url, echo=settings.debug, pool_pre_ping=True, pool_size=settings.database_pool_size, max_overflow=settings.database_max_overflow, ) @lru_cache def get_session_factory() -> async_sessionmaker[AsyncSession]: return async_sessionmaker(get_engine(), class_=AsyncSession, expire_on_commit=False) async def get_session() -> AsyncIterator[AsyncSession]: async with get_session_factory()() as session: yield session