from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session import logging import os from contextlib import contextmanager from dotenv import load_dotenv # Load environment variables load_dotenv() # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Database configuration DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@localhost:5432/ai_giga_tcg") # Create engine with connection pooling and other optimizations for PostgreSQL engine = create_engine( DATABASE_URL, pool_size=5, max_overflow=10, pool_timeout=30, pool_recycle=1800 ) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() def get_db(): """Dependency to get a database session. Used for simple, single service operations.""" db = SessionLocal() try: yield db finally: db.close() @contextmanager def transaction(db: Session): """Context manager to handle database transactions. Used for service operations that require multiple database operations.""" try: yield db.commit() except Exception as e: db.rollback() # Reset the session state db.expire_all() raise e def init_db(): Base.metadata.create_all(bind=engine)