""" Database Configuration for Workers - ServiceManagerWeb Async database session management para Celery workers """ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from sqlalchemy import DateTime, func from contextlib import asynccontextmanager from typing import AsyncGenerator import uuid from datetime import datetime from app.core.config import get_settings settings = get_settings() # Create async engine para workers engine = create_async_engine( settings.DATABASE_URL, echo=False, # Menos verbose en workers pool_size=5, max_overflow=10, pool_pre_ping=True, pool_recycle=3600, ) # Create session factory AsyncSessionLocal = async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, autoflush=True, autocommit=False ) class Base(DeclarativeBase): """Base class para todos los modelos SQLAlchemy - compartida con backend.""" # Columnas comunes para auditoría id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() ) @asynccontextmanager async def get_async_session_context() -> AsyncGenerator[AsyncSession, None]: """ Context manager para obtener sesión de base de datos en workers. Usage: async with get_async_session_context() as db: # Usar db aquí pass Yields: AsyncSession: Sesión de base de datos """ async with AsyncSessionLocal() as session: try: yield session await session.commit() except Exception: await session.rollback() raise finally: await session.close()