9

次のようなクエリを生成する必要があります。

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

SQLAlchemy を使用して、次のように 2 つのクエリ オブジェクトを作成します。

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 ユニオンの括弧内でこれらのステートメントを取得して、上記のクエリを生成するにはどうすればよいですか?

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 に答える