Join 减少SQLAlchemy产生的重复连接子句

Join 减少SQLAlchemy产生的重复连接子句,join,sqlalchemy,Join,Sqlalchemy,我目前很难找到一种方法来减少SQLAlchemy产生的多余的JOIN子句。我目前正在查询TableA,它急切地加载TableB,而TableB急切地加载TableC 我的查询还涉及到TableB和TableC的显式联接,以便对这些表的列进行筛选。但是,它会生成详细的SQL,如下所示: SELECT * FROM TableA JOIN TableB ON TableA.fk == TableB.id JOIN TableC

我目前很难找到一种方法来减少SQLAlchemy产生的多余的
JOIN
子句。我目前正在查询
TableA
,它急切地加载
TableB
,而
TableB
急切地加载
TableC

我的查询还涉及到
TableB
TableC
的显式联接,以便对这些表的列进行筛选。但是,它会生成详细的SQL,如下所示:

  SELECT * FROM TableA 
           JOIN TableB             ON TableA.fk == TableB.id
           JOIN TableC             ON TableB.fk == TableC.id
LEFT OUTER JOIN TableB AS TableB_1 ON TableA.fk == TableB.id
LEFT OUTER JOIN TableC AS TableC_1 ON TableB.fk == TableC.id
我目前正在使用反向引用中的
lazy='joined'
急切地从
TableA
查询中加载
TableB
TableC
。用子查询加载此数据会产生一个N+1选择问题(因此,从急切加载切换到延迟加载不是一个选项)

我还尝试将
innerjoin=True
添加到backreference,这将
LEFT-OUTER-JOIN
子句替换为内部联接(仅在输出中
JOIN
)。我希望SQLAlchemy能够合并相同的连接子句,但它似乎没有


有没有办法在查询或关系中指定相同的联接子句不应重复?

您能给我们看一下代码吗?现在还不清楚你到底在做什么

要从显式联接中快速填充关系集合,应使用
contains\u eager
选项,而不是
joinedload
。即

from sqlalchemy.orm import contains_eager, joinedload

session.query(ModelA).join(ModelB).options(contains_eager(ModelA.bs_list)).all()
相对于

session.query(ModelA).join(ModelB).options(joinedload(ModelA.bs_list)).all()

谢谢我忽略了关系文档中的
包含部分。这正是我想要的。