外号和化名混淆了政治家的身份

2024-04-29 06:13:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想连接到一个查询中包含的多个表。其中一些连接将被别名化。例如:

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

然而,相反,bc表被删除,我得到如下结果:

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是从中选择的,但从未被查询过^{<在本例中,cd4>}在默认情况下被急切地加载(通过orm中的lazy = 'joined'

解决方法:

可以使用设置为identity的条件添加联接,该条件将人工查询所需的表。在本例中:

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,并且很难证明其正确性


Tags: andiddbsqlonsessionaliassome