save_or_update используя SQLalchemy 0.6 - PullRequest
1 голос
/ 26 марта 2011

save_or_update был удален в 0,6.Существуют ли альтернативы их использованию в версии 0.6 и выше?

Я заметил существование метода _save_or_update_state для объектов сеанса, но нет документов по этому методу.

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Michael Bayer ответил на этот вопрос:

update (), save_or_update (), save () все устарело. add () помещает объект в сеансе во всех случаях, используя информацию о постоянстве уже связаны с объектом определить ВСТАВИТЬ или ОБНОВИТЬ. этот значит, если вы просто сделаете новый Foo (id = некоторый идентификатор), это временно - SQLAlchemy не загружал его. Это будет Вставленные.

Имейте в виду, что Сессия поддерживает личную карту все уникальные первичные ключи уже загружен в память, а также состояние, которое было получено от база данных. По этой причине вы как правило, не может просто положить объект в сеанс с некоторыми произвольными данными, и ожидать, что это "займет место" фактическая строка, которая будет загружена перевод. SQLAlchemy не будет знать, что с ним делать, так как он имеет понятия не имею, какие изменения были сделаны в этом ряду по сравнению с тем, что уже подарок.

Если вы хотите создать новый Foo () с первичным ключом, который может или, возможно, еще не существует в база данных, вы хотите объединить государство этого объекта с тем, который является производится сессией. использование session.merge () для этого варианта использования.
это загрузит существующий объект из текущей транзакции, если есть, и объединить состояние вашего снаружи возразить с ним, возвращая пример. Экземпляр, который вы передаете ему остается неизменным и вне сессия.

1 голос
/ 29 марта 2011

Session.merge() отлично работает как для нового, так и для существующего объекта. Но вы должны помнить, что merge() возвращает объект, связанный с сеансом, в отличие от add()save_or_update() в старых версиях), который помещает объект, переданный в качестве аргумента в сеанс. Такое поведение необходимо для обеспечения того, чтобы для каждого идентификатора в сеансе был один объект.

0 голосов
/ 08 августа 2012

session.merge() не будет работать, если у вас настроена база данных как ведущий-ведомый, где вы обычно хотите запрашивать у ведомого, но записывать в ведущий.У меня есть такая настройка, и в итоге я запросил у мастера непосредственно перед записью, а затем использовал session.add(), если данных на самом деле нет на мастере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...