SQLAlchemy 合并括号问题

9 投票
1 回答
4717 浏览
提问于 2025-04-17 14:36

我需要生成一个类似下面的查询:

(select * from ... where .. and .. order by .. limit ..)
union all
(select * from ... where .. and .. order by .. limit ..)
order by ..

我使用SQLAlchemy创建了两个查询对象,如下所示:

q1 = Session.query(..).filter(..).filter(..).order_by(..).limit(..)
q2 = Session.query(..).filter(..).filter(..).order_by(..).limit(..)
q = q1.union_all(q2).order_by(..).all()

但是这样不行,因为SQLAlchemy生成的查询中,q1和q2没有用括号括起来,这会导致错误。

我该如何把这两个查询放在括号里,以便它们的合并结果能和上面表达的查询一致呢?

1 个回答

19

你需要先创建子查询,然后再从这些子查询中选择数据:

from sqlalchemy import union_all

q1 = Session.query(..).filter(..).filter(..).order_by(..).limit(..).subquery()
q2 = Session.query(..).filter(..).filter(..).order_by(..).limit(..).subquery()
q = Session.query(..).select_entity_from(union_all(q1.select(), q2.select()).order_by(..).all()

.subquery() 方法会返回一个 别名对象,这个对象不能直接支持 union_all 查询。所以,我们需要构建一个 select_entity_from() 结构,并把 sqlalchemy.sql.expression.union_all() 函数 的结果传进去,这样你仍然可以得到正确映射到对象的结果。

撰写回答