Мое приложение позволяет пользователям создавать и удалять Site
объекты. Я реализовал это, используя session.add()
и session.delete()
. Затем у меня есть кнопки «Сохранить» и «Сброс», которые вызывают session.commit()
и session.rollback()
.
Если я добавляю новый Site
, затем сохраняю / фиксирую его, а затем удаляю, все идет хорошо. Однако, если я пытаюсь удалить объект из сеанса до того, как он будет сохранен, я получаю ошибку «not persisted».
Код:
self.newSite = Site('foo')
self.session.add(self.newSite)
print self.session.new
self.session.delete(self.newSite)
Выход:
IdentitySet([<Site('foo')>])
Traceback (most recent call last):
File "C:\Program Files\Eclipse\dropins\plugins\org.python.pydev.debug_2.2.1.2011071313\pysrc\pydevd_comm.py", line 744, in doIt
result = pydevd_vars.evaluateExpression(self.thread_id, self.frame_id, self.expression, self.doExec)
File "C:\Program Files\Eclipse\dropins\plugins\org.python.pydev.debug_2.2.1.2011071313\pysrc\pydevd_vars.py", line 375, in evaluateExpression
result = eval(compiled, updated_globals, frame.f_locals)
File "<string>", line 1, in <module>
File "C:\Python27\Lib\site-packages\sqlalchemy\orm\session.py", line 1245, in delete
mapperutil.state_str(state))
InvalidRequestError: Instance '<Site at 0x1ed5fb0>' is not persisted
Я понимаю, что здесь происходит, но я не уверен, что мне следует делать вместо этого.
Есть ли какой-то другой метод удаления еще не сохраненного объекта из сеанса? Или мне следует позвонить session.flush()
перед попыткой удаления, если объект, который я хочу удалить, еще не очищен?
Если это последнее, то session.query()
автоматически сбрасывается (гарантируя, что ожидающие объекты отображаются в результатах запроса), а session.delete()
- нет (что обеспечит возможность удаления отложенных объектов без ошибок)