from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, declarative_base from sqlalchemy.exc import SQLAlchemyError from fastapi import HTTPException from .settings import settings import logging logger = logging.getLogger(__name__) DATABASE_URL = settings.DATABASE_URL connect_args = {"connect_timeout": 10} if settings.DB_SSL: connect_args["sslmode"] = "require" engine = create_engine( DATABASE_URL, pool_pre_ping=True, pool_recycle=300, pool_size=20, max_overflow=30, pool_timeout=30, pool_reset_on_return='commit', connect_args=connect_args, echo=False, future=True ) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() def get_db(): db = SessionLocal() try: yield db except HTTPException: raise except SQLAlchemyError as e: logger.error(f"Database error: {e}") db.rollback() raise except Exception as e: logger.error(f"Unexpected database session error: {e}") db.rollback() raise finally: db.close()