From ee9518f8ae2132fab8782bf0b51f5560393a92ed Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 3 Oct 2012 11:11:34 -0400 Subject: [PATCH] - add one more #2583 test to cover the "multiple PK switch" use case --- lib/sqlalchemy/orm/session.py | 2 +- test/orm/test_transaction.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 1651648acd..071f0a85d9 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1331,7 +1331,7 @@ class Session(object): # map (see test/orm/test_naturalpks.py ReversePKsTest) self.identity_map.discard(state) if state in self.transaction._key_switches: - orig_key = self.transaction._key_switches[0] + orig_key = self.transaction._key_switches[state][0] else: orig_key = state.key self.transaction._key_switches[state] = (orig_key, instance_key) diff --git a/test/orm/test_transaction.py b/test/orm/test_transaction.py index 12a995805b..7eb91485d8 100644 --- a/test/orm/test_transaction.py +++ b/test/orm/test_transaction.py @@ -1154,6 +1154,39 @@ class NaturalPKRollbackTest(fixtures.MappedTest): assert s.identity_map[(User, ('u1',))] is u1 assert s.identity_map[(User, ('u2',))] is u2 + def test_multiple_key_replaced_by_update(self): + users, User = self.tables.users, self.classes.User + + mapper(User, users) + + u1 = User(name='u1') + u2 = User(name='u2') + u3 = User(name='u3') + + s = Session() + s.add_all([u1, u2, u3]) + s.commit() + + s.delete(u1) + s.delete(u2) + s.flush() + + u3.name = 'u1' + s.flush() + + u3.name = 'u2' + s.flush() + + s.rollback() + + assert u1 in s + assert u2 in s + assert u3 in s + + assert s.identity_map[(User, ('u1',))] is u1 + assert s.identity_map[(User, ('u2',))] is u2 + assert s.identity_map[(User, ('u3',))] is u3 + def test_key_replaced_by_oob_insert(self): users, User = self.tables.users, self.classes.User -- 2.47.2