我们需要一种方法来在查询之外和一组给定的缓存值中显式加载关系。
我们的查询非常复杂,并且有一些显式的joinLoad(..)选项。遗憾的是,使用太多的东西确实会使查询整体变慢,所以我们开始使用subqueryLoad(..)技术。但是,这不能按预期工作,subqueryLoad在第一个查询上使用distinct子句发出第二个查询(这是非常昂贵的)。我们要做的是在第一个查询完成运行后构建一组我们需要加载的关系密钥。一旦我们从第二个查询中获得结果,我们如何告诉sqlalchemy将第一个查询的结果与第二个查询的结果相关联?
这里有一段代码,展示了我们现在所做的事情(虽然有效但很难看):
result = session.query(tableA).option(lazyload('*'), joinedload(tableB)).all()
relationship_keys = set()
for r in result:
relationship_keys.add(r.tableC_id)
cache_relationships = session.query(tableC).filter(tableC.id.in_(relationship_keys)).all()
# link instance between them. This will not emit SQL as it will hit the cache previously loaded by using session.get(..)
[r.tableC_relationship for r in result]