from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from sqlalchemy.orm import DeclarativeBase from app.core.config import settings # Production: use DATABASE_URL (e.g. Supabase connection string) # Local dev: construct from individual POSTGRES_* settings if settings.DATABASE_URL: DATABASE_URL = settings.DATABASE_URL # Ensure asyncpg driver prefix if DATABASE_URL.startswith("postgres://"): DATABASE_URL = DATABASE_URL.replace("postgres://", "postgresql+asyncpg://", 1) elif DATABASE_URL.startswith("postgresql://"): DATABASE_URL = DATABASE_URL.replace("postgresql://", "postgresql+asyncpg://", 1) else: DATABASE_URL = f"postgresql+asyncpg://{settings.POSTGRES_USER}:{settings.POSTGRES_PASSWORD}@{settings.POSTGRES_HOST}:{settings.POSTGRES_PORT}/{settings.POSTGRES_DB}" engine = create_async_engine(DATABASE_URL, echo=False) async_session_factory = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) class Base(DeclarativeBase): pass async def get_db() -> AsyncSession: async with async_session_factory() as session: try: yield session await session.commit() except Exception: await session.rollback() raise finally: await session.close()