From: Mike Bayer Date: Sun, 5 Jun 2011 16:22:34 +0000 (-0400) Subject: - Fixed bug where transaction-level "deleted" X-Git-Tag: rel_0_7_1~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08f493dcb1a084a19aee434070dbb4890c56d9ad;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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. --- 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