I have two tables beard
and moustache
defined below:
+--------+---------+------------+-------------+ | person | beardID | beardStyle | beardLength | +--------+---------+------------+-------------+ +--------+-------------+----------------+ | person | moustacheID | moustacheStyle | +--------+-------------+----------------+
I have created a SQL Query in PostgreSQL which will combine these two tables and generate following result:
+--------+---------+------------+-------------+-------------+----------------+ | person | beardID | beardStyle | beardLength | moustacheID | moustacheStyle | +--------+---------+------------+-------------+-------------+----------------+ | bob | 1 | rasputin | 1 | | | +--------+---------+------------+-------------+-------------+----------------+ | bob | 2 | samson | 12 | | | +--------+---------+------------+-------------+-------------+----------------+ | bob | | | | 1 | fu manchu | +--------+---------+------------+-------------+-------------+----------------+
Query:
SELECT * FROM beards LEFT OUTER JOIN mustaches ON (false) WHERE person = "bob" UNION ALL SELECT * FROM beards b RIGHT OUTER JOIN mustaches ON (false) WHERE person = "bob"
However I can not create SQLAlchemy representation of it. I tried several ways from implementing from_statement
to outerjoin
but none of them really worked. Can anyone help me with it?
Advertisement
Answer
From @Francis P‘s suggestion I came up with this snippet:
q1 = session. query(beard.person.label('person'), beard.beardID.label('beardID'), beard.beardStyle.label('beardStyle'), sqlalchemy.sql.null().label('moustachID'), sqlalchemy.sql.null().label('moustachStyle'), ). filter(beard.person == 'bob') q2 = session. query(moustache.person.label('person'), sqlalchemy.sql.null().label('beardID'), sqlalchemy.sql.null().label('beardStyle'), moustache.moustachID, moustache.moustachStyle, ). filter(moustache.person == 'bob') result = q1.union(q2).all()
However this works but you can’t call it as an answer because it appears as a hack. This is one more reason why there should be RIGHT OUTER JOIN
in sqlalchemy.