expunge() misses the transaction._deleted collection
Issue #2182
resolved
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)
-
reporter -
reporter - changed status to resolved
-
reporter - removed milestone
Removing milestone: 0.6.8 (automated comment)
- Log in to comment
I would note this seems to be occurring without the usage of make_transient(), not sure how yet.