Spaces:
Paused
Paused
| """ | |
| Async SQLAlchemy engine + session factory. | |
| All application code uses `get_db()` as a FastAPI dependency. | |
| """ | |
| from collections.abc import AsyncGenerator | |
| from sqlalchemy.ext.asyncio import ( | |
| AsyncSession, | |
| async_sessionmaker, | |
| create_async_engine, | |
| ) | |
| from sqlalchemy.orm import DeclarativeBase | |
| from app.config import get_settings | |
| class Base(DeclarativeBase): | |
| pass | |
| def _make_engine(): | |
| settings = get_settings() | |
| return create_async_engine( | |
| settings.database_url, | |
| echo=False, | |
| connect_args={"check_same_thread": False}, | |
| ) | |
| # Module-level engine and session factory (created once at import time) | |
| engine = _make_engine() | |
| AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False) | |
| async def get_db() -> AsyncGenerator[AsyncSession, None]: | |
| """FastAPI dependency that yields a database session.""" | |
| async with AsyncSessionLocal() as session: | |
| try: | |
| yield session | |
| await session.commit() | |
| except Exception: | |
| await session.rollback() | |
| raise | |