如何判断SQLAlchemy的延迟关系是否未加载?
在使用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__
属性字典,来检查数据是否已经存在。