""" Database configuration and session management. Job ID: MTAD-IMPL-2025-11-18-CL """ from sqlalchemy import create_engine, event from sqlalchemy.engine import Engine from sqlalchemy.orm import declarative_base, sessionmaker from app.config import settings import logging logger = logging.getLogger(__name__) # Create database engine with connection pooling engine = create_engine( settings.database_url, poolclass=None if "sqlite" in settings.database_url else None, pool_size=settings.database_pool_size, max_overflow=settings.database_max_overflow, echo=settings.debug, future=True, ) # Session factory SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Base class for models Base = declarative_base() # Event listeners for PostgreSQL @event.listens_for(Engine, "connect") def set_sqlite_pragma(dbapi_conn, connection_record): """Enable foreign keys for SQLite (if using SQLite).""" if "sqlite" in settings.database_url: cursor = dbapi_conn.cursor() cursor.execute("PRAGMA foreign_keys=ON") cursor.close() def get_db(): """Dependency for FastAPI to get database session.""" db = SessionLocal() try: yield db finally: db.close() async def init_db(): """Initialize database tables.""" try: Base.metadata.create_all(bind=engine) logger.info("Database tables created successfully") except Exception as e: logger.error(f"Error initializing database: {e}") raise async def close_db(): """Close database connections.""" engine.dispose() logger.info("Database connections closed")