我想加入查询中包含的多个表。其中一些连接将具有别名。例如:
c_alias = aliased( C )
q = db.session.query( A, B, C ).join( A.some_things ).outerjoin(
c_alias, and_(
c_alias.b_id == B.id,
c_alias.d_id == 1
)
)
我希望这会生成如下 SQL:
SELECT
a.id, b.id, c.id, ...
FROM
a, b, c
LEFT JOIN things ON things.a_id = a.id
LEFT OUTER JOIN c AS c_alias ON c_alias.b_id = b.id AND c_alias.d_id = 1
然而,取而代之的是,b
andc
表被删除了,我得到了类似的东西:
SELECT
a.id, b.id, c.id, ...
FROM
a, c
LEFT JOIN things ON things.a_id = a.id
LEFT OUTER JOIN c AS c_alias ON c_alias.b_id = b.id AND c_alias.d_id = 1
这当然会引发错误,因为从表b
中选择但从不查询。 A.some_things
在这种情况下,默认情况下会急切地加载(通过lazy = 'joined'
在 orm 中)。
解决方法:
可以添加一个条件集为身份的连接,该身份将人为地查询所需的表。在这个例子中:
q = db.session.query( A, B, C ).join( B, B.id == B.id ).join( C, C.id == C.id )\
.join( A.some_things ).outerjoin(
c_alias, and_(
c_alias.b_id == B.id,
c_alias.d_id == 1
)
)
这将产生所需的结果,但会导致一些相当混乱的 SQL 并且很难证明其合理性。