sqlalchemy FULL OUTER JOIN

python, sqlalchemy

Solution

Since 1.1. sqlalchemy now fully supports FULL OUTER JOINS. See here: https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.join.params.full

So for your code you would want to do:

q1 = (db.session.query(
        tb1.user_id.label('u_id'),
        func.count(tb1.id).label('tb1_c')
    )
    .group_by(tb1.user_id)
).cte('q1')

q2 = (db.session.query(
        tb2.user_id.label('u_id'),
        func.count(tb2.id).label('tb2_c')
    )
    .group_by(tb2.user_id)
).cte('q2')

result = db.session.query(
    func.coalesce(q1.u_id, q2.u_id).label('u_id'),
    q1.tb1_c,
    q2.tb2_c
).join(
    q2,
    q1.u_id == q2.u_id,
    full=True
)

Note that as with any FULL OUTER JOIN, `tb1_c` and `tb2_c` may be null so you might want to apply a coalesce on them.

Problem

How to implement FULL OUTER JOIN in sqlalchemy on orm level. Here my code: ``` q1 = (db.session.query( tb1.user_id.label('u_id'), func.count(tb1.id).label('tb1_c') ) .group_by(tb1.user_id) ) q2 = (db.session.query( tb2.user_id.label('u_id'), func.count(tb2.id).label('tb2_c') ) .group_by(tb2.user_id) ) ``` above two queries and I want to apply FULL OUTER JOIN on them.

Original source