Как узнать, не загружено ли ленивое отношение, с помощью SQLAlchemy?
-
06-07-2019 - |
Вопрос
С помощью SQLAlchemy можно ли заранее узнать, будет ли отношение загружено с отложенной загрузкой?
Например, учитывая ленивое отношение «родители-дети» и экземпляр X «родителя», я хотел бы знать, является ли «X.children» quot; уже загружен, без запуска запроса.
Решение
Я думаю, что вы можете взглянуть на словарь атрибутов __ dict __
, чтобы проверить, есть ли уже данные или нет.
Другие советы
Вы можете получить список всех выгруженных свойств (как отношений, так и столбцов) из 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
Чуть лучше, чем ответ Haes (хотя он фактически делает то же самое) - использовать hasattr (), как в:
>>> hasattr(X, 'children')
False