from collections.abc import AsyncIterator from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.orm import DeclarativeBase from .config import get_settings class Base(DeclarativeBase): pass _engine = None _session_factory = None def get_engine(): global _engine, _session_factory if _engine is None: _engine = create_async_engine(get_settings().database_url, pool_pre_ping=True) _session_factory = async_sessionmaker(_engine, expire_on_commit=False) return _engine def reset_engine() -> None: global _engine, _session_factory _engine = None _session_factory = None async def get_db() -> AsyncIterator[AsyncSession]: get_engine() assert _session_factory is not None async with _session_factory() as session: yield session async def create_schema() -> None: from . import models # noqa: F401 async with get_engine().begin() as conn: await conn.run_sync(Base.metadata.create_all)