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:
Jonas Miederer 2026-09-06 22:28:53 +00:00
parent 2ba062c4c5
commit e178ae406d
12 changed files with 686 additions and 3 deletions

36
backend/app/db.py Normal file
View 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))