我目前无法找到一种方法来减少多余的 JOIN
SQLAlchemy 预加载产生的子句。我目前正在查询 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 会合并相同的连接子句,但它似乎没有。
有没有办法在查询或关系上指定不应重复相同的连接子句?
最佳答案
你能告诉我们代码吗?目前尚不清楚您到底在做什么。
要从显式连接急切地填充关系集合,您应该使用 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()
关于join - 减少 SQLAlchemy 产生的重复 JOIN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18296464/