summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/session.py
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2018-01-04 16:31:10 -0500
committerGerrit Code Review <gerrit@ci.zzzcomputing.com>2018-01-04 16:31:10 -0500
commit350671ff86070ca17c09dab7631221ac1eb33d65 (patch)
tree5ab630b1ca7584fbb794b0464f0d52524b03154f /lib/sqlalchemy/orm/session.py
parent5a6885bac8d025aea680901d9284759766ef2162 (diff)
parent5811276bb7515af3418a6d20f5213d658e320121 (diff)
downloadsqlalchemy-350671ff86070ca17c09dab7631221ac1eb33d65.tar.gz
Merge "Check for object was expunged before restoring after pk switch + rollback"
Diffstat (limited to 'lib/sqlalchemy/orm/session.py')
-rw-r--r--lib/sqlalchemy/orm/session.py14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py
index bd0bf9197..6c91df866 100644
--- a/lib/sqlalchemy/orm/session.py
+++ b/lib/sqlalchemy/orm/session.py
@@ -339,14 +339,20 @@ class SessionTransaction(object):
"""
assert self._is_transaction_boundary
- self.session._expunge_states(
- set(self._new).union(self.session._new),
- to_transient=True)
+ to_expunge = set(self._new).union(self.session._new)
+ self.session._expunge_states(to_expunge, to_transient=True)
for s, (oldkey, newkey) in self._key_switches.items():
+ # we probably can do this conditionally based on
+ # if we expunged or not, but safe_discard does that anyway
self.session.identity_map.safe_discard(s)
+
+ # restore the old key
s.key = oldkey
- self.session.identity_map.replace(s)
+
+ # now restore the object, but only if we didn't expunge
+ if s not in to_expunge:
+ self.session.identity_map.replace(s)
for s in set(self._deleted).union(self.session._deleted):
self.session._update_impl(s, revert_deletion=True)