9

我需要生成类似于以下内容的查询:

(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 不在括号内,它会产生错误。

我怎样才能在括号内为 q1 q2 union 获取这些语句以产生上述查询?

4

1 回答 1

17

您需要创建子查询,然后从这些子查询中进行选择:

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()方法返回一个Alias 对象,该对象不union_all直接支持查询。因此,相反,我们需要构建一个select_entity_from()构造,而是传入sqlalchemy.sql.expression.union_all() 函数结果,因此您仍然可以将结果映射到正确的对象。

于 2013-02-03T13:42:28.220 回答