from collections.abc import Iterator from contextlib import contextmanager from sqlalchemy import Engine, create_engine from sqlalchemy.orm import Session, sessionmaker from backend.config import get_settings def get_engine(url: str | None = None) -> Engine: settings = get_settings() database_url = url or settings.database_url connect_args: dict[str, object] = {} if database_url.startswith("sqlite"): connect_args = {"check_same_thread": False} return create_engine(database_url, connect_args=connect_args) @contextmanager def get_session(engine: Engine) -> Iterator[Session]: factory = sessionmaker(autocommit=False, autoflush=False, bind=engine) session = factory() try: yield session session.commit() except Exception: session.rollback() raise finally: session.close()