С SQLAlchemy, есть ли способ заранее знать, будет ли отношение загружено lazy?
Например, учитывая ленивое отношение parent- > children и экземпляр X "parent", я хотел бы знать, загружен ли "X.children", не вызывая запрос.
Как узнать, пока не загружено ленивое отношение, с SQLAlchemy?
Ответ 1
Я думаю, вы можете посмотреть на словарь атрибутов __dict__
для проверки наличия или отсутствия данных.
Ответ 2
Вы можете получить список всех выгруженных свойств (оба отношения и столбцы) из 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
Ответ 3
Чуть более аккуратный, чем Хейс (хотя он делает то же самое), должен использовать hasattr(), как в:
>>> hasattr(X, 'children')
False