29 lines
901 B
Python
29 lines
901 B
Python
"""Async SQLAlchemy engine, session factory, and request transaction boundary."""
|
|
|
|
from collections.abc import AsyncGenerator
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine
|
|
|
|
from app.core.config import Settings, get_settings
|
|
|
|
|
|
def create_database_engine(settings: Settings | None = None) -> AsyncEngine:
|
|
resolved_settings = settings or get_settings()
|
|
return create_async_engine(resolved_settings.database_url, pool_pre_ping=True)
|
|
|
|
|
|
engine = create_database_engine()
|
|
SessionFactory = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
|
|
|
|
|
async def get_db_session() -> AsyncGenerator[AsyncSession, None]:
|
|
async with SessionFactory() as session:
|
|
try:
|
|
yield session
|
|
except Exception:
|
|
await session.rollback()
|
|
raise
|
|
else:
|
|
await session.commit()
|
|
|