"""Database engine and session; pool_recycle=180, pool_pre_ping=True for TiDB.""" from collections.abc import Generator from sqlalchemy import create_engine from sqlmodel import Session, Session as SessionType import redis as redis_lib from app.core.config import get_settings _engine = None _redis_client = None def get_redis() -> redis_lib.Redis: global _redis_client if _redis_client is None: _redis_client = redis_lib.from_url(get_settings().REDIS_URL, decode_responses=True) return _redis_client def get_engine(): global _engine if _engine is None: s = get_settings() _engine = create_engine( s.sqlalchemy_database_uri, pool_recycle=180, pool_pre_ping=True, echo=False, ) return _engine def get_session() -> Generator[SessionType, None, None]: engine = get_engine() with Session(engine) as session: try: yield session except Exception: session.rollback() raise finally: session.close()