Как узнать, не загружено ли ленивое отношение, с помощью SQLAlchemy?

StackOverflow https://stackoverflow.com/questions/258775

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top