# services/recipes/app/core/database.py """ Database configuration and session management for Recipe Service """ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, Session from sqlalchemy.pool import StaticPool from contextlib import contextmanager from typing import Generator from .config import settings # Create database engine engine = create_engine( settings.DATABASE_URL, poolclass=StaticPool, pool_pre_ping=True, pool_recycle=300, echo=settings.DEBUG, ) # Create session factory SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db() -> Generator[Session, None, None]: """ Dependency to get database session """ db = SessionLocal() try: yield db finally: db.close() @contextmanager def get_db_context() -> Generator[Session, None, None]: """ Context manager for database session """ db = SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close() class DatabaseManager: """Database management utilities""" @staticmethod def create_all_tables(): """Create all database tables""" from shared.database.base import Base Base.metadata.create_all(bind=engine) @staticmethod def drop_all_tables(): """Drop all database tables (for testing)""" from shared.database.base import Base Base.metadata.drop_all(bind=engine) @staticmethod def get_session() -> Session: """Get a new database session""" return SessionLocal() # Database manager instance db_manager = DatabaseManager()