database.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. """Database connection and session management (SQLite + SQLAlchemy)."""
  2. from sqlalchemy import create_engine, event
  3. from sqlalchemy.orm import sessionmaker, declarative_base
  4. from .config import DATABASE_URL
  5. # SQLite engine (check_same_thread=False for FastAPI async)
  6. engine = create_engine(
  7. DATABASE_URL,
  8. connect_args={"check_same_thread": False},
  9. echo=False,
  10. )
  11. # F2 fix: enable foreign key constraints for SQLite (OFF by default)
  12. @event.listens_for(engine, "connect")
  13. def _set_sqlite_pragma(dbapi_connection, connection_record):
  14. cursor = dbapi_connection.cursor()
  15. cursor.execute("PRAGMA foreign_keys=ON")
  16. cursor.close()
  17. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  18. Base = declarative_base()
  19. def get_db():
  20. """Dependency for FastAPI route database sessions."""
  21. db = SessionLocal()
  22. try:
  23. yield db
  24. finally:
  25. db.close()
  26. def init_db():
  27. """Create all database tables."""
  28. from . import models # noqa: F401 - ensure models are imported
  29. Base.metadata.create_all(bind=engine)