session.py 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """数据库引擎与会话。"""
  2. from collections.abc import Generator
  3. from contextlib import contextmanager
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.orm import Session, sessionmaker
  6. from config.settings import database_url
  7. _engine = None
  8. _SessionLocal = None
  9. def get_engine():
  10. global _engine, _SessionLocal
  11. if _engine is None:
  12. _engine = create_engine(
  13. database_url(),
  14. pool_pre_ping=True,
  15. pool_recycle=3600,
  16. echo=False,
  17. )
  18. _SessionLocal = sessionmaker(bind=_engine, autoflush=False, autocommit=False)
  19. return _engine
  20. def get_session_factory() -> sessionmaker[Session]:
  21. get_engine()
  22. assert _SessionLocal is not None
  23. return _SessionLocal
  24. @contextmanager
  25. def session_scope() -> Generator[Session, None, None]:
  26. factory = get_session_factory()
  27. session = factory()
  28. try:
  29. yield session
  30. session.commit()
  31. except Exception:
  32. session.rollback()
  33. raise
  34. finally:
  35. session.close()