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 get_session_factory() -> async_sessionmaker[AsyncSession]: get_engine() assert _session_factory is not None return _session_factory def reset_engine() -> None: global _engine, _session_factory _engine = None _session_factory = None async def get_db() -> AsyncIterator[AsyncSession]: async with get_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)