#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. В результате объект будет вести себя так, как если бы он был создан заново, за исключением сохранения любых значений атрибутов / коллекций, которые были загружены во время вызова.