如何使用 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 模型吗?
SQL ALCHEMY - 如何返回 query(model).all() 作为值的元组而不是模型实例