1"""Async engine / session factory."""23from __future__ import annotations45from collections.abc import AsyncIterator67from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine89from app.core.config import get_settings10from app.models import Base1112_settings = get_settings()13engine = create_async_engine(14 _settings.database_url,15 echo=False,16 pool_pre_ping=True,17 connect_args={"timeout": 30} if _settings.database_url.startswith("sqlite") else {},18)19SessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)202122async def init_db() -> None:23 async with engine.begin() as conn:24 if _settings.database_url.startswith("sqlite"):25 await conn.exec_driver_sql("PRAGMA journal_mode=WAL")26 await conn.exec_driver_sql("PRAGMA foreign_keys=ON")27 await conn.run_sync(Base.metadata.create_all)282930async def get_session() -> AsyncIterator[AsyncSession]:31 async with SessionLocal() as session:32 yield session33