2026-09-04 10:20:40 +08:00

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()