Ответ 1
ZopeTransactionExtension
в DBSession
в сочетании с активным pyramid_tm
в вашем проекте будет обрабатывать все коммиты для вас. Ситуации, в которых необходимо выполнить флеш, следующие:
-
Вы хотите создать новый объект и вернуть первичный ключ.
DBSession.add(obj) DBSession.flush() log.info('look, my new object got primary key %d', obj.id)
-
Вы хотите попытаться выполнить некоторый SQL в точке сохранения и откате, если он завершится с ошибкой без аннулирования всей транзакции.
sp = transaction.savepoint() try: foo = Foo() foo.id = 5 DBSession.add(foo) DBSession.flush() except IntegrityError: log.error('something already has id 5!!') sp.rollback()
Во всех других случаях, связанных с ORM, транзакция будет прервана для вас по исключению или автоматически зафиксирована с помощью pyramid_tm
. Если вы выполняете необработанный SQL, вам нужно будет выполнить transaction.commit()
самостоятельно или пометить сеанс как грязный через zope.sqlalchemy.mark_changed(DBSession)
, иначе ZTE не сможет узнать, что сеанс изменился.
Также вы должны оставить expire_on_commit
по умолчанию True
, если у вас нет действительно веской причины.