【问题标题】:How to find out if a lazy relation isn't loaded yet, with SQLAlchemy?如何使用 SQLAlchemy 找出是否还没有加载惰性关系?
【发布时间】:2010-09-20 12:02:40
【问题描述】:

使用 SQLAlchemy,有没有办法预先知道关系是否会延迟加载?
例如,给定一个惰性父->子关系和“父”的实例 X,我想知道“X.children”是否已经加载,而不触发查询。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    我想你可以查看孩子的__dict__ 属性字典来检查数据是否已经存在。

    【讨论】:

      【解决方案2】:

      比 Haes 的回答稍微简洁(尽管它实际上做同样的事情)是使用 hasattr(),如:

      >>> hasattr(X, 'children')
      False
      

      【讨论】:

      • 这不适用于当前的 sqlalchemy。 hasattr(obj, field) 不等于 field in obj.__dict__
      • 我已经在 SQLAlchemy 0.8 中进行了测试,如果对象被分离,这确实有效。但是,如果附加了它,那么使用 hasattr 会触发“孩子”的延迟加载,这可能不是您想要的。相反,在 0.8 中,我们可以使用 inspect() 调用:res = inspect(X)'children' in res.unloaded - 无论对象是附加还是分离,它都有效。
      【解决方案3】:

      您可以从sqlalchemy.orm.attributes.instance_state(obj).unloaded 获取所有已卸载属性(包括关系和列)的列表。

      见:Completing object with its relations and avoiding unnecessary queries in sqlalchemy

      一个更简单的方法是使用inspect(),它给出了相同的结果:

      from sqlalchemy import inspect
      from sqlalchemy.orm import lazyload
      
      user = session.query(User).options(lazyload(User.articles)).first()
      ins = inspect(user)
      
      ins.unloaded  # <- set or properties that are not yet loaded
      

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 2012-08-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多