如何使用 SQLAlchemy 找出是不是还没有加载惰性关系?

Posted

技术标签:

【中文标题】如何使用 SQLAlchemy 找出是不是还没有加载惰性关系?【英文标题】: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”是否已经加载,而不触发查询。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何使用 SQLAlchemy 找出是不是还没有加载惰性关系?的主要内容,如果未能解决你的问题,请参考以下文章

sqlalchemy Oracle 架构

如果数据库已经存在,你还需要创建 SQLAlchemy 模型吗?

SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例

如何分析 SQLAlchemy 支持的应用程序?

使用SqlAlchemy时如何方便的取得dict数据dumps成Json

SQLAlchemy 中的星型模式