From 08f493dcb1a084a19aee434070dbb4890c56d9ad Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 5 Jun 2011 12:22:34 -0400 Subject: [PATCH] - Fixed bug where transaction-level "deleted" collection wouldn't be cleared of expunged states, raising an error if they later became transient [ticket:2182]. Also in 0.6.8. --- CHANGES | 6 ++++++ lib/sqlalchemy/orm/session.py | 2 ++ test/orm/test_session.py | 15 +++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/CHANGES b/CHANGES index 3c7bcd3d4d..3454476742 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,12 @@ CHANGES auto-increment correctly; [ticket:2170]. Also in 0.6.8. + - Fixed bug where transaction-level "deleted" + collection wouldn't be cleared of expunged + states, raising an error if they later + became transient [ticket:2182]. + Also in 0.6.8. + - sql - Fixed bug whereby metadata.reflect(bind) would close a Connection passed as a diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 29353c4b72..fe38f01be8 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1072,6 +1072,8 @@ class Session(object): 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) diff --git a/test/orm/test_session.py b/test/orm/test_session.py index 2c12142102..282a8914dc 100644 --- a/test/orm/test_session.py +++ b/test/orm/test_session.py @@ -292,6 +292,21 @@ class SessionTest(_fixtures.FixtureTest): sess.flush() assert u1 in sess + def test_make_transient_plus_rollback(self): + # test for [ticket:2182] + users, User = self.tables.users, self.classes.User + + mapper(User, users) + sess = Session() + u1 = User(name='test') + sess.add(u1) + sess.commit() + + sess.delete(u1) + sess.flush() + make_transient(u1) + sess.rollback() + def test_deleted_flag(self): users, User = self.tables.users, self.classes.User -- 2.39.5