| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- """数据库引擎与会话。"""
- from collections.abc import Generator
- from contextlib import contextmanager
- from sqlalchemy import create_engine
- from sqlalchemy.orm import Session, sessionmaker
- from config.settings import database_url
- _engine = None
- _SessionLocal = None
- def get_engine():
- global _engine, _SessionLocal
- if _engine is None:
- _engine = create_engine(
- database_url(),
- pool_pre_ping=True,
- pool_recycle=3600,
- echo=False,
- )
- _SessionLocal = sessionmaker(bind=_engine, autoflush=False, autocommit=False)
- return _engine
- def get_session_factory() -> sessionmaker[Session]:
- get_engine()
- assert _SessionLocal is not None
- return _SessionLocal
- @contextmanager
- def session_scope() -> Generator[Session, None, None]:
- factory = get_session_factory()
- session = factory()
- try:
- yield session
- session.commit()
- except Exception:
- session.rollback()
- raise
- finally:
- session.close()
|