有没有办法验证在Sqlalchemy中是否已成功加载所有模型关系?

时间:2017-06-02 19:03:44

标签: python sqlalchemy eager-loading

我熟悉Sqlalchemy中的joinedload和subqueryload选项,我正在使用它们来查询稍后从会话中删除并缓存的大型结果集。

有没有办法验证此时从顶层模型开始的每个可能的关系都是急切加载的?

2 个答案:

答案 0 :(得分:0)

确保您渴望加载所需关系的支持方式是将lazy="raise"放在您的所有关系上。在你这样做之前,它不会告诉你你做错了什么,但是EAFP

children = relationship(Child, lazy="raise")

答案 1 :(得分:0)

以下迭代器将迭代从给定模型可到达的所有关系。它产生一个(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)