Как отключить ленивую загрузку SQLAlchemy для отношений отдельных экземпляров?

#python #sqlalchemy #lazy-loading #detach

Вопрос:

Я разработал функцию группы выборки, подобную JDO, в Python с помощью SQLAlchemy, чтобы управлять сокращением графиков объектов для сортировки ответов веб-служб.

Во время этого процесса я отсоединяю экземпляры с помощью session.expunge(entity)

Проблема в том, что, когда маршаллер JSON или pydantic обращается к отношениям атрибутов экземпляра, которые еще не были загружены, даже если экземпляр отсоединен, ленивая загрузка SQLAlchemy все равно запускается для этого атрибута и завершается неудачно, потому что экземпляр больше не привязан к сеансу (очевидно):

DetachedInstanceError("Parent instance <MyClass at 0x1439051f0> is not bound to a Session; lazy load operation of attribute 'relation' cannot proceed")

Итак, мой первый вопрос заключается в том, почему ленивые загрузчики не отключаются при отсоединении экземпляра, поскольку для меня это не имеет смысла.

Во-вторых, если это «функция», как я могу отключить или обойти ленивые загрузчики, чтобы предотвратить эту ошибку и позволить рассматриваемой связи атрибутов не отображаться для маршаллера?

Я обнаружил, что настройка self.__dict__['relation'] = None помогает в некоторых обстоятельствах обмануть ленивых загрузчиков, чтобы они не включались, но, к сожалению, это не всегда работает…

Комментарии:

1. Спасибо за self.__dict__['relation'] = None это ! 🙂

Ответ №1:

Что касается вашего второго вопроса, вы могли бы использовать make_transient (см. Здесь)

Функция удалит свою связь с любым сеансом, а также с его InstanceState.identity. В результате объект будет вести себя так, как если бы он был создан заново, за исключением сохранения любых значений атрибутов / коллекций, которые были загружены во время вызова.