"""Engine/session helpers. The DB URL comes from Env.database_url so the same code runs on SQLite (default) or Postgres by changing one env var.""" from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from Env import database_url from src.db.models import Base _engine = create_engine(database_url, future=True) SessionLocal = sessionmaker(bind=_engine, future=True, expire_on_commit=False) def get_engine(): return _engine def init_db(): """Create the storage dir + tables if missing (safe to call every run).""" from Env import data_dir data_dir.mkdir(parents=True, exist_ok=True) Base.metadata.create_all(_engine) @contextmanager def session_scope(): """Transactional session: commit on success, roll back on error.""" session = SessionLocal() try: yield session session.commit() except Exception: session.rollback() raise finally: session.close()