我想连接到一个查询中包含的多个表。其中一些连接将被别名化。例如:
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
和c
表被删除,我得到如下结果:
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,并且很难证明其正确性
目前没有回答
相关问题 更多 >
编程相关推荐