Coverage for app / db / database.py: 73%
22 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-04 06:09 -0500
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-04 06:09 -0500
1import os
2from pathlib import Path
3from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
4from sqlalchemy.orm import DeclarativeBase
6from app.core.config import settings
9class Base(DeclarativeBase):
10 pass
13# Ensure data directory exists for SQLite
14if "sqlite" in settings.database_url:
15 db_path = settings.database_url.split("///")[-1] if "///" in settings.database_url else settings.database_url.split(":///")[-1]
16 db_dir = os.path.dirname(db_path)
17 if db_dir:
18 Path(db_dir).mkdir(parents=True, exist_ok=True)
21engine = create_async_engine(
22 settings.database_url,
23 echo=False,
24 future=True,
25)
27AsyncSessionLocal = async_sessionmaker(
28 engine,
29 class_=AsyncSession,
30 expire_on_commit=False,
31 autocommit=False,
32 autoflush=False,
33)
36async def get_db() -> AsyncSession:
37 async with AsyncSessionLocal() as session:
38 try:
39 yield session
40 finally:
41 await session.close()
44async def init_db():
45 """Initialize database tables."""
46 async with engine.begin() as conn:
47 await conn.run_sync(Base.metadata.create_all)