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

时间:2008-11-03 14:28:03

标签: python sqlalchemy

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

3 个答案:

答案 0 :(得分:15)

您可以从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

答案 1 :(得分:5)

我认为您可以查看孩子的__dict__属性字典,以检查数据是否已存在。

答案 2 :(得分:3)

比Haes回答稍微整洁(虽然它有效地做同样的事情)是使用hasattr(),如:

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