I need to generate a query similar to the following:
(select * from ... where .. and .. order by .. limit ..)
union all
(select * from ... where .. and .. order by .. limit ..)
order by ..
Using SQLAlchemy, I create two query objects as in:
q1 = Session.query(..).filter(..).filter(..).order_by(..).limit(..)
q2 = Session.query(..).filter(..).filter(..).order_by(..).limit(..)
q = q1.union_all(q2).order_by(..).all()
However it won’t work because SQLAlchemy generates queries: q1 and q2 are not within parenthesis and it creates an error.
How can I get these statements inside parenthesis for q1 q2 union to result in above expressed query?
You need to create subqueries, then select from those subqueries:
The
.subquery()method returns an Alias object, which does not supportunion_allqueries directly. So instead, we need to build aselect_entity_from()construct, passing in thesqlalchemy.sql.expression.union_all()function result instead, so you still get the results mapped to the correct objects.