【问题标题】:Is there a way to verify that all model relationships are successfully eager loaded in Sqlalchemy?有没有办法验证所有模型关系在 Sqlalchemy 中是否成功加载?
【发布时间】:2017-06-05 22:13:26
【问题描述】:

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

有没有办法验证从顶层模型到下层的每一个可能的关系在这一点上都是预先加载的?

【问题讨论】:

    标签: python sqlalchemy eager-loading


    【解决方案1】:

    确保您已预先加载所需的所有关系的受支持方法是将lazy="raise" 放在您的所有关系上。它不会告诉你你做错了什么,直到你做错了,但是EAFP

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

    【讨论】:

    • 因此,如果您从会话中删除对象然后尝试访问关系,您将自动获得加薪。 OP 要求的是一种在删除所有关系之前验证是否延迟加载的方法,或者换一种说法,您如何枚举从特定模型开始的关系图中的所有关系。我不认为这个答案是对问题的回应
    • 赞成,因为它仍然是一条有用的信息。但是@SamHartman 是正确的,这不是我正在寻找的~droid~ 答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2015-02-28
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多