join - 减少 SQLAlchemy 产生的重复 JOIN 子句

标签 join sqlalchemy

我目前无法找到一种方法来减少多余的 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'在急切加载的反向引用上 TableBTableC来自 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/

相关文章:

python - Alembic 使用现有的 SQLAlchemy 引擎迁移

python - 将SQLalchemy查询结果传递给scrapy中的start_urls

python - 如何在sqlalchemy中使用多对多

MYSQL 按多个连接子项排序

mysql - 不是那么简单的 SQL 查询

mysql - 缓慢的 Mysql Inner 加入多个 OR

python - Pyramid + FormAlchemy 模型改进

MySQL 内连接不同名称的列

SQL返回重复结果

python - SQLAlchemy按多对多关系排序