Удаление объекта из сеанса SQLAlchemy до его сохранения

Мое приложение позволяет пользователям создавать и удалять объекты Site . Я реализовал это с помощью session.add() и session.delete() . Затем у меня есть кнопки «Сохранить» и «Сброс», которые вызывают session.commit() и session.rollback() .

Если я добавлю новый Site , сохраните / зафиксируйте его, а затем удалите его, все будет в порядке. Однако, если я попытаюсь удалить объект из сеанса, прежде чем он будет сохранен, я получаю ошибку «не сохраняется».

Код:

 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() не выполняет (что гарантирует, что отложенные объекты могут быть удалены без ошибок) ,

One Solution collect form web for “Удаление объекта из сеанса SQLAlchemy до его сохранения”

Вы можете использовать Session.expunge() . Я думаю, что логическое обоснование с delete() заключается в том, что это беспокоит вас, что вы не отслеживаете вещи, если отправляете их в ожидании. Но я могу видеть другую сторону этой истории, я подумаю об этом. В основном состояние, подразумеваемое delete() включает некоторые предположения о сохранении, но они, вероятно, не так значительны, как я думаю. Затем приходит в голову метод «вычеркнуть или удалить», что смешно, что в основном «сохранить или обновить» мы первоначально скопировали из Hibernate, который только что стал «добавлять». «add» может выполнять переходы переходных -> ожидающих, а также отключенных -> постоянных – может ли потенциальный «remove ()» выполнять как ожидающие-> переходные и постоянные-> удаленные? слишком плохо, что сеанс с областью уже имеет «remove ()» ….

Session.query() autoflushes, потому что он собирается выйти в базу данных, чтобы испустить некоторый SQL, чтобы получить некоторые строки; так что независимо от того, что вы локально должны выходить первым. delete() просто отмечает состояние объекта, поэтому нет необходимости вызывать любой SQL. Если мы хотим, чтобы delete() работал над ожидающим, мы просто изменим это утверждение.

Интересно, что если вы rollback() сеанс, все, что вы add() пределах этого сеанса, было ли оно покраснело, было исключено.

  • В чем разница между declarative_base () и db.Model?
  • SQLAlchemy - максимальная длина столбца
  • Создание базы данных с помощью SQLAlchemy in Flask
  • Проблема SQLAlchemy Parenthesis
  • Целевая база данных не обновляется
  • Может ли SQLAlchemy's session.merge () обновить свой результат с новыми данными из базы данных?
  • динамическая схема sqlalchemy для объекта во время выполнения
  • Проблемы с соединением с SQLAlchemy и несколькими процессами
  • Python - лучший язык программирования в мире.