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






Я думаю, вы могли бы посмотреть в дочернем словаре атрибутов __dict__, чтобы проверить, есть ли там данные или нет.
Немного аккуратнее, чем ответ Хаеса (хотя он фактически делает то же самое), - это использовать hasattr (), например:
>>> hasattr(X, 'children')
False
Я тестировал в SQLAlchemy 0.8, и это работает, если объект отсоединен. Однако, если он прикреплен, использование hasattr запускает ленивую загрузку «детей», что, вероятно, не то, что вам нужно. Вместо этого в 0.8 мы можем использовать вызов inspect (): res = inspect(X)'children' in res.unloaded, который работает независимо от того, прикреплен ли объект или отсоединен.
Вы можете получить список всех выгруженных свойств (как отношений, так и столбцов) из 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
Это не работает с текущей sqlalchemy.
hasattr(obj, field)не эквивалентенfield in obj.__dict__.