from __future__ import annotations from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.orm import DeclarativeBase, sessionmaker from app.settings import DATABASE_URL _kwargs = {"connect_args": {"check_same_thread": False}} if DATABASE_URL.startswith("sqlite") else {"pool_pre_ping": True} engine = create_engine(DATABASE_URL, **_kwargs) SessionLocal = sessionmaker(bind=engine, expire_on_commit=False, autoflush=True) class Base(DeclarativeBase): pass def init_db() -> None: from app import models # noqa: F401 Base.metadata.create_all(engine) def get_db(): db = SessionLocal() try: yield db finally: db.close() @contextmanager def session(): db = SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close()