Spaces:
Running
Running
File size: 1,299 Bytes
60d4850 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | """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()
|