Python中SqlAlchemy的query如何多次执行filter并添加or条件?
由于某些原因,无法在一个 filter 里执行添加所有的 or 条件
所以有以下情况: 已经存在一个 query
query = session.query(User).filter(or_(User.id == 2,User.id == 3))
↑上面这个 query 的代码无法修改
此时 sql 语句为 SELECT * FROM USER WHERE id=2 or id =3;
此时还需要添加一个条件 or_(User.id == 4,User.id == 5)
如果这样做:
query = query.filter(or_(User.id == 4,User.id == 5))
则 sql 语句变为
SELECT * FROM USER WHERE id=2 or id =3 AND (id=4 or id =5)
我期望的结果是
SELECT * FROM USER WHERE id=2 or id =3 OR id=4 or id =5
请问要怎么办?
Python中SqlAlchemy的query如何多次执行filter并添加or条件?
from sqlalchemy import or_
from sqlalchemy.orm import Session
# 假设已有User模型和session对象
# 方法1:链式调用filter,每个filter内部用or_包裹条件
query = session.query(User).filter(
or_(User.name == '张三', User.age > 18)
).filter(
or_(User.email.like('%@example.com'), User.status == 1)
)
# 方法2:使用多个or_条件一次性filter
query = session.query(User).filter(
or_(User.name == '张三', User.age > 18),
or_(User.email.like('%@example.com'), User.status == 1)
)
# 方法3:动态构建查询条件(更灵活)
conditions = []
conditions.append(or_(User.name == '张三', User.age > 18))
conditions.append(or_(User.email.like('%@example.com'), User.status == 1))
query = session.query(User).filter(*conditions)
# 执行查询
results = query.all()
核心要点:
- 每个
filter()中的or_()只作用于当前括号内的条件 - 多个
filter()之间是AND关系 - 可以用
*conditions展开动态条件列表
建议用方法3动态构建更清晰。
方案 1 (推荐):解决掉“某些原因”,采用楼上的答案;
方案 2 (不推荐):如果没法解决“某些原因”,看 SQLAlchemy 源码,
人肉提取需要重写的条件(如示例的 or_(<a target="_blank" href="http://User.id" rel="nofollow noopener">User.id</a> == 2,<a target="_blank" href="http://User.id" rel="nofollow noopener">User.id</a> == 3)),
再重写该过滤条件 (修改 query._criterion )。
最后还是重写了整个搜索方法…


