28 lines
947 B
Python
28 lines
947 B
Python
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
|