diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-10-04 22:11:28 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2021-10-04 22:11:28 +0000 |
| commit | bb3560851280d338ffb03b72da25488f7db34d22 (patch) | |
| tree | 015f3ba5d9631b52b83b9fe4f28b01b2de03c2b5 /lib/sqlalchemy | |
| parent | c33a0a9c4732743a58e5e40ae6d8fd52e7865ca8 (diff) | |
| parent | e7e0757efe042b8343ef44d4f61a33cdbc072ff3 (diff) | |
| download | sqlalchemy-bb3560851280d338ffb03b72da25488f7db34d22.tar.gz | |
Merge "disallow adding to identity map that's been discarded"
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 = {} |
