from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, DeclarativeBase from sqlalchemy.pool import StaticPool class Base(DeclarativeBase): pass def get_engine(db_url: str): if db_url.startswith("sqlite"): connect_args = {"check_same_thread": False} # In-memory SQLite is per-connection; without a shared StaticPool, # each new session would see a fresh, empty database. if ":memory:" in db_url: return create_engine( db_url, connect_args=connect_args, poolclass=StaticPool ) return create_engine(db_url, connect_args=connect_args) return create_engine(db_url) def make_session_factory(engine): return sessionmaker(bind=engine, autoflush=False, autocommit=False) def init_db(engine): Base.metadata.create_all(bind=engine)