SQLAlchemy修复SAWarning时Subquery无scalar_subquery属性报错怎么办
问题原因
出现该问题是方法调用顺序和SQLAlchemy的类型特性导致的:
scalar_subquery()是Query查询对象的方法,你提前对查询对象调用了.subquery(),生成的是Subquery类型对象,该类型本身没有scalar_subquery()属性,所以会抛出属性不存在的错误。- 最初的警告是因为旧版本SQLAlchemy会隐式将
Subquery对象转换为标量子查询传入exists(),该隐式转换不符合规范才触发告警。
解决方法
两种可选方案均可解决问题:
方案1:调整方法调用顺序
不提前调用.subquery(),直接对原始查询对象调用scalar_subquery()后传入exists():
# 定义时保留为Query对象,不调用.subquery() subqueryPrimaryApproverIc1 = db_session.query(ParticipatingIcT.id).filter( (ParticipatingIcT.id == agreement.participating_ic_id), (ParticipatingIcT.ic_nihsac == func.substr(approver.nihsac, 1, 3)) ) # 调用时生成标量子查询 func.exists(subquerySecondApproverIc1.scalar_subquery())
方案2:直接传入Subquery对象
exists()本身原生支持接收Subquery类型作为参数,不需要额外转换,直接传入即可,不会触发警告:
# 子查询定义保持原有逻辑不变 subqueryPrimaryApproverIc1 = db_session.query(ParticipatingIcT.id).filter( (ParticipatingIcT.id == agreement.participating_ic_id), (ParticipatingIcT.ic_nihsac == func.substr(approver.nihsac, 1, 3)) ).subquery() # 直接把子查询对象传入exists func.exists(subquerySecondApproverIc1)
该方案兼容1.4之前未上线scalar_subquery()方法的SQLAlchemy版本。
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

