diff --git a/backend/app/database.py b/backend/app/database.py new file mode 100644 index 0000000..597d553 --- /dev/null +++ b/backend/app/database.py @@ -0,0 +1,42 @@ +"""Database engine, session, and base model.""" +from sqlalchemy import create_engine, event +from sqlalchemy.orm import sessionmaker, DeclarativeBase +from app.config import settings + + +# Engine +if settings.DATABASE_URL.startswith("sqlite"): + engine = create_engine( + settings.DATABASE_URL, + connect_args={"check_same_thread": False}, + echo=False, + ) + # Enable foreign keys for SQLite + @event.listens_for(engine, "connect") + def _fk_pragma_on_connect(dbapi_con, con_record): + cursor = dbapi_con.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() +else: + engine = create_engine(settings.DATABASE_URL, echo=False, pool_pre_ping=True) + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + + +class Base(DeclarativeBase): + """Declarative base for all models.""" + pass + + +def get_db(): + """FastAPI dependency: yields a database session.""" + db = SessionLocal() + try: + yield db + finally: + db.close() + + +def init_db(): + """Create all tables (used for dev / first run).""" + Base.metadata.create_all(bind=engine)