Join 减少SQLAlchemy产生的重复连接子句
我目前很难找到一种方法来减少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
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()
谢谢我忽略了关系文档中的
包含部分。这正是我想要的。