"""FastAPI dependencies.""" from __future__ import annotations from typing import TYPE_CHECKING, Annotated from fastapi import Depends, Request from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Session if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator def get_db(request: Request) -> Iterator[Session]: """Get database session from app state.""" with Session(request.app.state.engine) as session: yield session async def get_async_db(request: Request) -> AsyncIterator[AsyncSession]: """Get an async database session from app state. expire_on_commit=False keeps ORM attributes readable after commit without triggering implicit IO, which would raise under asyncio. """ async with AsyncSession(request.app.state.engine, expire_on_commit=False) as session: yield session DbSession = Annotated[Session, Depends(get_db)] AsyncDbSession = Annotated[AsyncSession, Depends(get_async_db)]