from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool from sqlalchemy.orm import sessionmaker, Session from contextlib import contextmanager from typing import Generator from .config import settings from sqlmodel import SQLModel # Create the database engine with connection pooling engine = create_engine( settings.DATABASE_URL, poolclass=QueuePool, pool_size=5, max_overflow=10, pool_pre_ping=True, # Verify connections before use pool_recycle=300, # Recycle connections every 5 minutes echo=settings.DEBUG # Log SQL queries in debug mode ) # Create a SessionLocal class for database sessions SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db_session() -> Generator[Session, None, None]: """ Generator function for FastAPI dependency injection. Provides database sessions and ensures they're properly closed. Yields: Session: Database session that will be automatically closed """ db = SessionLocal() try: yield db finally: db.close() @contextmanager def get_db() -> Generator[Session, None, None]: """ Context manager for database sessions. Ensures the database session is properly closed after use. """ db = SessionLocal() try: yield db finally: db.close()