Flask-SQLAlchemy自定义Session类报错:class_参数重复值问题
问题原因
Flask-SQLAlchemy的create_session方法会默认向sqlalchemy.orm.sessionmaker传递class_=SignallingSession参数,而你在session_options里又传入了class_=CustomSession,导致sessionmaker收到重复的class_参数,触发TypeError。
另外,直接继承SQLAlchemy原生Session会丢失Flask-SQLAlchemy会话的上下文绑定、信号处理等核心功能,这也是需要修正的点。
解决方案
让自定义Session继承Flask-SQLAlchemy的SignallingSession,并重写SQLAlchemy类的create_session方法,避免参数冲突:
from flask_sqlalchemy import SQLAlchemy, SignallingSession from sqlalchemy.orm import sessionmaker class CustomSession(SignallingSession): def execute(self, *args, **kwargs): # 执行数据库操作前的自定义逻辑 print("即将执行数据库操作") # 调用父类方法执行原逻辑 result = super().execute(*args, **kwargs) # 执行数据库操作后的自定义逻辑 print("数据库操作执行完成") return result class CustomSQLAlchemy(SQLAlchemy): def create_session(self, options): if options is None: options = {} # 使用自定义Session替换默认的SignallingSession return sessionmaker(class_=CustomSession, db=self, **options) # 初始化数据库实例 db = CustomSQLAlchemy()
补充说明
此前自定义Query类成功,是因为query_cls是Flask-SQLAlchemy专门提供的扩展参数,不会和底层的sessionmaker参数产生冲突;而自定义Session需要兼容Flask-SQLAlchemy的会话机制,因此不能直接通过session_options传递class_参数。
内容的提问来源于stack exchange,提问作者Rahel
相关产品推荐
相关产品推荐

