【发布时间】:2010-09-20 12:02:40
【问题描述】:
使用 SQLAlchemy,有没有办法预先知道关系是否会延迟加载?
例如,给定一个惰性父->子关系和“父”的实例 X,我想知道“X.children”是否已经加载,而不触发查询。
【问题讨论】:
标签: python sqlalchemy
使用 SQLAlchemy,有没有办法预先知道关系是否会延迟加载?
例如,给定一个惰性父->子关系和“父”的实例 X,我想知道“X.children”是否已经加载,而不触发查询。
【问题讨论】:
标签: python sqlalchemy
我想你可以查看孩子的__dict__ 属性字典来检查数据是否已经存在。
【讨论】:
比 Haes 的回答稍微简洁(尽管它实际上做同样的事情)是使用 hasattr(),如:
>>> hasattr(X, 'children')
False
【讨论】:
hasattr(obj, field) 不等于 field in obj.__dict__。
res = inspect(X)'children' in res.unloaded - 无论对象是附加还是分离,它都有效。
您可以从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
【讨论】: