session.py 841 B

12345678910111213141516171819202122232425262728293031
  1. """Async SQLAlchemy engine and session factory.
  2. The engine is created lazily so that importing the FastAPI app (e.g. to export
  3. the OpenAPI schema) never requires a live database connection.
  4. """
  5. from __future__ import annotations
  6. from functools import lru_cache
  7. from sqlalchemy.ext.asyncio import (
  8. AsyncEngine,
  9. AsyncSession,
  10. async_sessionmaker,
  11. create_async_engine,
  12. )
  13. from app.config import get_settings
  14. @lru_cache
  15. def get_engine() -> AsyncEngine:
  16. """Return a lazily-created, cached async engine."""
  17. settings = get_settings()
  18. return create_async_engine(settings.database_url, pool_pre_ping=True)
  19. @lru_cache
  20. def get_sessionmaker() -> async_sessionmaker[AsyncSession]:
  21. """Return a cached async session factory bound to the engine."""
  22. return async_sessionmaker(get_engine(), expire_on_commit=False)