0

我想加入查询中包含的多个表。其中一些连接将具有别名。例如:

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

然而,取而代之的是,bandc表被删除了,我得到了类似的东西:

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 并且很难证明其合理性。

4

0 回答 0