from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import declarative_base from ..core.config import settings import contextlib # Create async engine for FastAPI async_engine = create_async_engine( settings.DATABASE_URL, echo=True, future=True, pool_pre_ping=True ) # Create async session factory AsyncSessionLocal = async_sessionmaker( bind=async_engine, class_=AsyncSession, expire_on_commit=False ) # Create declarative base for models Base = declarative_base() # Database dependency for FastAPI routes async def get_db(): async with AsyncSessionLocal() as session: try: yield session finally: await session.close() # Database access for background tasks and services class Database: def __init__(self): self._session_factory = AsyncSessionLocal @contextlib.asynccontextmanager async def session(self): """Get a database session with automatic commit/rollback""" session = self._session_factory() try: yield session await session.commit() except: await session.rollback() raise finally: await session.close() async def get_session(self): """Get a session for manual management""" return self._session_factory() # Create singleton instance for database access db = Database()