SqlAlchemy 中,一个 query 如何多次执行 filter 添加 or 条件?

2017-04-07 14:09:36 +08:00
 blacklinux

由于某些原因,无法在一个 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

请问要怎么办?

5065 次点击
所在节点    Python
4 条回复
xyjtou
2017-04-07 14:40:45 +08:00
.union 一下就可以。
jjx
2017-04-07 14:49:42 +08:00
c = [User.id == 2, User.id == 3]

if xxx:
c += [User.id == 4,User.id == 5]

q = session.query(User).filter(or_(*c))
siteshen
2017-04-08 00:55:44 +08:00
方案 1 (推荐):解决掉“某些原因”,采用楼上的答案;
方案 2 (不推荐):如果没法解决“某些原因”,看 SQLAlchemy 源码,
人肉提取需要重写的条件(如示例的 `or_(User.id == 2,User.id == 3)`),
再重写该过滤条件 (修改 query._criterion )。
blacklinux
2017-04-21 17:54:12 +08:00
最后还是重写了整个搜索方法...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/353198

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX