"""Shared async database helpers for Celery tasks. Provides get_async_session() and cleanup_engine() used by both downloads.py and maintenance.py. This module must not import from either of those files to avoid circular imports. """ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from app.config import get_settings def get_async_session(): """Get async session factory for Celery tasks. Creates a fresh engine and session factory each time to avoid event loop issues when asyncio.run() creates new loops. """ settings = get_settings() engine = create_async_engine(settings.async_database_url, echo=False) session_factory = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) return session_factory, engine async def cleanup_engine(engine): """Properly dispose of the async engine.""" await engine.dispose()