如何让SQLAlchemy为MS SQL Server生成带双层括号的OR非空过滤条件
编辑:我在本次筛选后的查询逻辑中存在一处错误。不过因为这个问题的答案本身很有参考价值,因此保留原提问内容。
问题原因
SQLAlchemy生成SQL时会默认简化冗余括号,仅在运算符优先级需要时才保留括号。你需要额外外层括号的场景,通常是该OR条件需要和其他AND条件联合使用,避免因为SQL中AND优先级高于OR导致逻辑出错。
解决方案
可以通过两种方式强制为整个OR表达式包裹外层括号:
- 使用
grouped函数包裹整个条件表达式
from sqlalchemy import or_, grouped # 运算符写法 filter(grouped(TAB1.c.this.isnot(None) | TAB2.c.that.isnot(None))) # or_ 函数写法 filter(grouped(or_(TAB1.c.PERSONNE_ID.isnot(None), TAB2.c.PERSONNE_ID.isnot(None))))
- 直接调用表达式的
self_group()方法
filter(or_(TAB1.c.PERSONNE_ID.isnot(None), TAB2.c.PERSONNE_ID.isnot(None)).self_group())
以上两种写法生成的SQL都会符合你要求的WHERE ((this IS NOT NULL OR that IS NOT NULL))格式。
补充说明
如果该OR条件是WHERE子句中的唯一条件,单层括号和双层括号在T-SQL中的执行逻辑完全等价,不会出现结果差异。仅当该条件和其他AND条件并列时,才需要额外外层括号保证逻辑优先级正确。
内容的提问来源于stack exchange,提问作者Vincenzo Lavorini
相关产品推荐
相关产品推荐

