Flask-SQLAlchemy混合属性报错:期望SQL表达式却得到'0'
解决SQLAlchemy混合属性在with_entities中报错问题
问题根源
- 装饰器绑定错误:你把
purchases的表达式装饰器错误绑定到了visits属性上,导致SQLAlchemy无法识别purchases对应的SQL逻辑 - 返回值类型错误:表达式方法直接返回Python整数
0,SQLAlchemy无法将其解析为合法的SQL表达式
修正后的代码
修正MyModel类
class MyModel(Model): visits = Column(db.Numeric) @hybrid_property def purchases(self): return 0 @purchases.expression # 绑定到purchases属性的表达式装饰器 def purchases(cls): return db.literal(0) # 将整数转为SQL可识别的字面量表达式
查询代码保持不变
daily_stats = ( MyModel.query.with_entities( MyModel.purchases, MyModel.visits ) )
补充说明
db.literal(0)会把Python整数转换为SQL引擎能识别的字面量,最终生成的SQL语句会包含0 AS purchases,满足查询需求- 也可以用
db.text('0')替代db.literal(0),两者效果相近,db.literal更适配Python原生类型的转换
内容的提问来源于stack exchange,提问作者curiosityrock
相关产品推荐
相关产品推荐

