3

我目前很难找到一种方法来减少JOINSQLAlchemy 急切加载产生的多余子句。我目前正在查询TableA,它急切地加载TableB,并且TableB急切地加载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和查询。使用子查询加载此数据会产生 N+1 选择问题(因此不能从急切加载到延迟加载)。TableCTableA

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

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

4

1 回答 1

2

你能给我们看一下代码吗?目前尚不清楚您到底在做什么。

要从显式连接中急切地填充关系集合,您应该使用contains_eageroption 而不是joinedload. IE

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()
于 2013-08-18T07:59:02.963 回答