如何判断SQLAlchemy的延迟关系是否未加载?

19 投票
3 回答
5318 浏览
提问于 2025-04-11 17:48

在使用SQLAlchemy的时候,有没有办法提前知道一个关系是否会被延迟加载呢?
比如说,假设有一个父子关系是延迟加载的,现在我有一个“父”实例X,我想知道“X.children”这个子关系是否已经加载了,而不想去触发查询。

3 个回答

3

比Haes的回答稍微整洁一点(虽然它实际上做的事情是一样的),可以使用hasattr()这个函数,像这样:

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

你可以通过 sqlalchemy.orm.attributes.instance_state(obj).unloaded 来获取一个对象所有未加载的属性列表,包括关系和列。

具体可以参考这个链接:使用关系完成对象并避免在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
5

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

撰写回答