Spaces:
Sleeping
Sleeping
| """Database configuration and session management for Neon PostgreSQL.""" | |
| from sqlmodel import SQLModel | |
| from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine | |
| from sqlalchemy.orm import sessionmaker | |
| from typing import AsyncGenerator | |
| from core.config import settings | |
| def get_asyncpg_url(url: str) -> str: | |
| """Convert sslmode to ssl for asyncpg compatibility.""" | |
| # asyncpg uses 'ssl' instead of 'sslmode' | |
| return url.replace("sslmode=", "ssl=") | |
| # Async engine for Neon PostgreSQL | |
| async_engine = create_async_engine( | |
| get_asyncpg_url(settings.DATABASE_URL), | |
| echo=settings.ENVIRONMENT == "development", | |
| pool_pre_ping=True, | |
| pool_size=5, | |
| max_overflow=10, | |
| ) | |
| # Async session factory | |
| async_session_maker = sessionmaker( | |
| async_engine, | |
| class_=AsyncSession, | |
| expire_on_commit=False, | |
| ) | |
| async def get_db() -> AsyncGenerator[AsyncSession, None]: | |
| """Dependency: yield async database session.""" | |
| async with async_session_maker() as session: | |
| try: | |
| yield session | |
| finally: | |
| await session.close() | |
| async def create_db_tables(): | |
| """Create all tables on startup (development only).""" | |
| async with async_engine.begin() as conn: | |
| await conn.run_sync(SQLModel.metadata.create_all) | |