VoxDoc / app /db /database.py
joelthomas77's picture
Upload app code
60d4850 verified
"""Database engine configuration.
Phase 8: Supports PostgreSQL (via asyncpg) alongside SQLite (via aiosqlite).
Set ``DATABASE_URL`` env var or ``database_url`` in config to switch.
"""
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import declarative_base
import os
from app.config import settings
# Determine database URL — priority: config > env > default SQLite
_configured_url = settings.database_url or os.getenv("DATABASE_URL", "")
DATABASE_URL = _configured_url if _configured_url else "sqlite+aiosqlite:///./voxdoc.db"
# Engine kwargs differ by backend
_engine_kwargs: dict = {"echo": False}
if "sqlite" in DATABASE_URL:
_engine_kwargs["connect_args"] = {"check_same_thread": False}
elif "postgresql" in DATABASE_URL:
_engine_kwargs["pool_size"] = 10
_engine_kwargs["max_overflow"] = 20
_engine_kwargs["pool_pre_ping"] = True
engine = create_async_engine(DATABASE_URL, **_engine_kwargs)
AsyncSessionLocal = async_sessionmaker(
bind=engine,
class_=AsyncSession,
expire_on_commit=False,
autoflush=False
)
Base = declarative_base()
async def get_db():
async with AsyncSessionLocal() as session:
try:
yield session
finally:
await session.close()