expunge() misses the transaction._deleted collection

Issue #2182 resolved
Mike Bayer repo owner created an issue
from sqlalchemy import *
from sqlalchemy.orm import *

m = MetaData()
t1 = Table('t1', m,
    Column('id', Integer, primary_key=True)
)
class A(object):
    pass

mapper(A, t1)

e = create_engine('sqlite://')
m.create_all(e)

s = Session(e)

a1 = A()
s.add(a1)
s.commit()

s.delete(a1)
s.flush()
make_transient(a1)
s.rollback()



Traceback (most recent call last):
  File "test.py", line 25, in <module>
    s.rollback()
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 586, in rollback
    self.transaction.rollback()
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 318, in rollback
    transaction._rollback_impl()
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 334, in _rollback_impl
    self._restore_snapshot()
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 214, in _restore_snapshot
    self.session._update_impl(s)
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 1361, in _update_impl
    mapperutil.state_str(state))
sqlalchemy.exc.InvalidRequestError: Instance '<A at 0x1255c70>' is not persisted

patch:

diff -r bf0890c6694bd6464a0821e807d425111c9868c5 lib/sqlalchemy/orm/session.py
--- a/lib/sqlalchemy/orm/session.py Thu Jun 02 12:20:24 2011 -0400
+++ b/lib/sqlalchemy/orm/session.py Thu Jun 02 13:28:24 2011 -0400
@@ -1072,6 +1072,8 @@
             self.identity_map.discard(state)
             self._deleted.pop(state, None)
             state.detach()
+        elif self.transaction:
+            self.transaction._deleted.pop(state, None)

     def _register_newly_persistent(self, state):
         mapper = _state_mapper(state)

Comments (3)

  1. Mike Bayer reporter

    I would note this seems to be occurring without the usage of make_transient(), not sure how yet.

  2. Log in to comment