Как узнать, не загружено ли ленивое отношение, с помощью SQLAlchemy? - PullRequest
13 голосов
/ 03 ноября 2008

С помощью SQLAlchemy, есть ли способ заранее узнать, будет ли отношение загружено с отложенной загрузкой?
Например, учитывая ленивое отношение parent-> children и экземпляр X «parent», я хотел бы знать, загружен ли уже «X.children», без запуска запроса.

Ответы [ 3 ]

15 голосов
/ 29 июля 2014

Вы можете получить список всех выгруженных свойств (как отношений, так и столбцов) из 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 голосов
/ 04 ноября 2008

Я думаю, вы могли бы взглянуть на словарь атрибутов ребенка __dict__, чтобы проверить, есть ли уже данные или нет.

3 голосов
/ 15 января 2013

Немного аккуратнее, чем ответ Haes (хотя он фактически делает то же самое) - использовать hasattr (), как в:

>>> hasattr(X, 'children')
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...