feat: flow engine data layer with tests
- SQLModel tables: flow_definitions/versions/runs, approval_tasks - Alembic setup with autogenerate (sqlmodel types fixed via script.py.mako) - Settings extended (shared root .env), db engine/session helpers - pytest suite: conftest with isolated test DB, 5 model tests green
This commit is contained in:
parent
2ba062c4c5
commit
e178ae406d
12 changed files with 686 additions and 3 deletions
36
backend/app/db.py
Normal file
36
backend/app/db.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
"""Database engine, sessions, and FastAPI dependency."""
|
||||
|
||||
from collections.abc import Iterator
|
||||
|
||||
from sqlalchemy import Engine
|
||||
from sqlmodel import Session, SQLModel, create_engine
|
||||
|
||||
from .settings import settings
|
||||
|
||||
_engine: Engine | None = None
|
||||
|
||||
|
||||
def get_engine(url: str | None = None) -> Engine:
|
||||
"""Process-wide engine singleton (override URL in tests via settings)."""
|
||||
global _engine
|
||||
if _engine is None:
|
||||
_engine = create_engine(url or settings.database_url)
|
||||
return _engine
|
||||
|
||||
|
||||
def reset_engine() -> None:
|
||||
"""Drop the cached engine (used by the test suite between DB targets)."""
|
||||
global _engine
|
||||
if _engine is not None:
|
||||
_engine.dispose()
|
||||
_engine = None
|
||||
|
||||
|
||||
def get_session() -> Iterator[Session]:
|
||||
with Session(get_engine()) as session:
|
||||
yield session
|
||||
|
||||
|
||||
def create_all(url: str | None = None) -> None:
|
||||
"""Create tables directly (dev convenience; migrations own prod schema)."""
|
||||
SQLModel.metadata.create_all(get_engine(url))
|
||||
Loading…
Add table
Add a link
Reference in a new issue