"""数据库引擎与会话。""" 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()