# +====================================================================== # | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ] # +---------------------------------------------------------------------- # | Copyright (c) 2021-2026 一米阳光团队 版权所有 # | 开源协议: Apache-2.0 # +====================================================================== # 由 extensions/sqlalchemy.py 迁移而来。 """数据库核心:引擎、会话工厂、请求级会话上下文、声明式基类。""" from contextvars import ContextVar from sqlalchemy import create_engine from sqlalchemy.orm import declarative_base from sqlalchemy.orm import sessionmaker from config import ( SQLALCHEMY_MYSQL_URL, FASTAPI_DEBUG, DB_POOL_SIZE, DB_MAX_OVERFLOW, DB_POOL_RECYCLE, DB_POOL_TIMEOUT, DB_CONNECT_TIMEOUT, ) # 创建一个SQLAlchemy引擎 engine = create_engine( SQLALCHEMY_MYSQL_URL, pool_size=DB_POOL_SIZE, pool_recycle=DB_POOL_RECYCLE, pool_timeout=DB_POOL_TIMEOUT, max_overflow=DB_MAX_OVERFLOW, connect_args={"connect_timeout": DB_CONNECT_TIMEOUT}, pool_pre_ping=True, pool_use_lifo=True, echo_pool=FASTAPI_DEBUG, ) # SessionLocal该类的每个实例将是一个数据库会话。该类本身还不是数据库会话。 # 一旦我们创建了SessionLocal该类的实例,该实例将成为实际的数据库会话。 SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # 请求级数据库 session 上下文变量 _db_ctx: ContextVar = ContextVar('_db_ctx') def get_db_session(): """获取当前请求的数据库 session""" return _db_ctx.get() def commit_independently(obj): """ 使用独立session提交对象,不受请求事务影响 日志等审计数据无论业务成功或失败都应持久化, 因此需要绕过 AOP 事务中间件的 commit/rollback 机制。 """ independent_session = SessionLocal() try: independent_session.add(obj) independent_session.commit() except Exception: independent_session.rollback() raise finally: independent_session.close() # 声明式基类,所有业务模型继承它 Base = declarative_base()