from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from app.config import settings import logging logger = logging.getLogger(__name__) # Create SQLAlchemy engine with better error handling try: engine = create_engine( settings.DATABASE_URL, pool_pre_ping=True, # Verify connections before using pool_size=5, max_overflow=10, pool_recycle=3600, # Recycle connections after 1 hour echo=settings.DEBUG, # Log SQL queries in debug mode connect_args={ "connect_timeout": 10, # Connection timeout in seconds } ) logger.info("Database engine created successfully") except Exception as e: logger.error(f"Failed to create database engine: {e}") raise # Session factory SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Base class for models Base = declarative_base() # Dependency for FastAPI endpoints def get_db(): """ Database session dependency. Usage: db: Session = Depends(get_db) """ db = SessionLocal() try: yield db except Exception as e: logger.error(f"Database session error: {e}") db.rollback() raise finally: db.close()