减少SQLAlchemy生成的重复JOIN子句

时间:2013-08-18 06:46:13

标签: join sqlalchemy

我目前无法找到减少SQLAlchemy急切加载产生的多余JOIN子句的方法。我目前正在查询TableA,它急切地加载TableBTableB急切地加载TableC

我的查询还会将显式联接到TableBTableC,以便过滤这些表的列。但是,它会生成详细的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查询中加载TableCTableA。使用子查询加载此数据会产生N + 1选择问题(因此无法从急切加载到延迟加载)。

我还尝试将innerjoin=True添加到反向引用中,后者使用内部联接替换LEFT OUTER JOIN子句(仅在输出中使用JOIN)。我希望SQLAlchemy合并相同的join子句,但似乎没有。

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

1 个答案:

答案 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()