【发布时间】:2017-06-05 22:13:26
【问题描述】:
我熟悉 Sqlalchemy 中的joinedload 和 subqueryload 选项,我正在使用它们来查询一个大型结果集,该结果集稍后会从会话中删除并缓存。
有没有办法验证从顶层模型到下层的每一个可能的关系在这一点上都是预先加载的?
【问题讨论】:
标签: python sqlalchemy eager-loading
我熟悉 Sqlalchemy 中的joinedload 和 subqueryload 选项,我正在使用它们来查询一个大型结果集,该结果集稍后会从会话中删除并缓存。
有没有办法验证从顶层模型到下层的每一个可能的关系在这一点上都是预先加载的?
【问题讨论】:
标签: python sqlalchemy eager-loading
确保您已预先加载所需的所有关系的受支持方法是将lazy="raise" 放在您的所有关系上。它不会告诉你你做错了什么,直到你做错了,但是EAFP。
children = relationship(Child, lazy="raise")
【讨论】:
以下迭代器将迭代从给定模型可到达的所有关系。它产生一个(model_class, relationship_name) 的元组。您可以修改以查看prop.lazy 或类似内容,或者使用它来构造加载器选项以延迟加载正确的内容,或者任何看起来合适的内容。
from sqlalchemy import inspect
def recursive_relations(model, already_traversed = None):
if not already_traversed: already_traversed = set()
inspection = inspect(model)
already_traversed.add(model)
for name, prop in inspection.relationships.items():
yield (model, name)
if prop.mapper.class_ not in already_traversed:
already_traversed.add(prop.mapper.class_)
yield from recursive_relations(prop.mapper.class_, already_traversed)
【讨论】: