from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker from sqlalchemy import text import asyncio from api.config import settings DATABASE_URL = settings.DATABASE_URL engine = create_async_engine(DATABASE_URL, echo=False, future=True) SessionLocal = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession) async def wait_for_db(retries: int = 30, delay: float = 1.0) -> None: """Wait until the database is available. Retries with exponential backoff. Raises RuntimeError if DB is still unavailable after retries. """ last_exc = None for attempt in range(1, retries + 1): try: async with engine.connect() as conn: await conn.execute(text("SELECT 1")) return except Exception as e: last_exc = e wait = min(delay * (2 ** (attempt - 1)), 5) await asyncio.sleep(wait) raise RuntimeError(f"Could not connect to DB after {retries} attempts") from last_exc