from sqlalchemy import create_engine, event from sqlalchemy.orm import sessionmaker, DeclarativeBase from config import get_settings settings = get_settings() _is_sqlite = "sqlite" in settings.DATABASE_URL engine = create_engine( settings.DATABASE_URL, connect_args={"check_same_thread": False} if _is_sqlite else {}, echo=settings.DEBUG, ) # SQLite concurrency hardening: enable WAL mode + busy_timeout on every connection. # WAL allows concurrent readers alongside a single writer, eliminating most # "database is locked" errors under FastAPI's threaded request handling. if _is_sqlite: @event.listens_for(engine, "connect") def _set_sqlite_pragma(dbapi_conn, conn_record): cur = dbapi_conn.cursor() cur.execute("PRAGMA journal_mode=WAL") cur.execute("PRAGMA synchronous=NORMAL") cur.execute("PRAGMA busy_timeout=10000") cur.execute("PRAGMA foreign_keys=ON") cur.close() SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) class Base(DeclarativeBase): pass def get_db(): db = SessionLocal() try: yield db finally: db.close()