feat(phase1): core/ 基础设施迁移,旧路径改垫片
- core/: database/redis_client/jwt/password/response/exceptions/security/logger/deps/middleware/app - create_app 迁移到 core/app.py,中间件注册顺序与异常处理器原样保留 - extensions/ utils/ apps/ 旧文件全部改为 re-export 垫片,import 路径保持兼容 - 新增 core 单元测试(jwt/password/response/request 共 12 个) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
# +======================================================================
|
||||
# | 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()
|
||||
Reference in New Issue
Block a user