diff options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/identity.py | 14 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/session.py | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index 7eec4fd8d..6aea0d185 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -18,6 +18,9 @@ class IdentityMap(object): self._modified = set() self._wr = weakref.ref(self) + def _kill(self): + self._add_unpresent = _killed + def keys(self): return self._dict.keys() @@ -238,3 +241,14 @@ class WeakInstanceDict(IdentityMap): if st is state: self._dict.pop(state.key, None) self._manage_removed_state(state) + + +def _killed(state, key): + # external function to avoid creating cycles when assigned to + # the IdentityMap + raise sa_exc.InvalidRequestError( + "Object %s cannot be converted to 'persistent' state, as this " + "identity map is no longer valid. Has the owning Session " + "been closed?" % orm_util.state_str(state), + code="lkrp", + ) diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index f051d8df2..d5fb8a8e1 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1836,6 +1836,7 @@ class Session(_SessionClassMethods): """ all_states = self.identity_map.all_states() + list(self._new) + self.identity_map._kill() self.identity_map = identity.WeakInstanceDict() self._new = {} self._deleted = {} |
