我目前无法找到减少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'
来急切地从TableB
查询中加载TableC
和TableA
。使用子查询加载此数据会产生N + 1选择问题(因此无法从急切加载到延迟加载)。
我还尝试将innerjoin=True
添加到反向引用中,后者使用内部联接替换LEFT OUTER JOIN
子句(仅在输出中使用JOIN
)。我希望SQLAlchemy合并相同的join子句,但似乎没有。
有没有办法在查询或关系上指定不应重复相同的连接子句?
答案 0 :(得分:2)
你能告诉我们代码吗?目前尚不清楚你究竟在做什么。
要急切地从显式联接中填充关系集合,您应该使用contains_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()