diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2017-09-27 15:47:10 -0400 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci.zzzcomputing.com> | 2017-09-27 15:47:10 -0400 |
| commit | e111852270ee20fbc32934eeefd0883e8ffeaba8 (patch) | |
| tree | e71e7c3804ff28b893afd6f17ffc4b4b8d1dc1e9 /lib | |
| parent | 3d50251e0a04a7648c5d3d4c4bee22673fc5660e (diff) | |
| parent | 5abb036e9b9eba0f61cf9617dea2d879c2d5b09c (diff) | |
| download | sqlalchemy-e111852270ee20fbc32934eeefd0883e8ffeaba8.tar.gz | |
Merge "Don't expire "deferred" attributes in make_transient_to_detached"
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/orm/session.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/state.py | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 359370ab5..0287f1cfb 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -3037,7 +3037,7 @@ def make_transient_to_detached(instance): if state._deleted: del state._deleted state._commit_all(state.dict) - state._expire_attributes(state.dict, state.unloaded) + state._expire_attributes(state.dict, state.unloaded_expirable) def object_session(instance): diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py index 2e53fe9e3..4964c22e6 100644 --- a/lib/sqlalchemy/orm/state.py +++ b/lib/sqlalchemy/orm/state.py @@ -610,6 +610,7 @@ class InstanceState(interfaces.InspectionAttr): def unmodified_intersection(self, keys): """Return self.unmodified.intersection(keys).""" + return set(keys).intersection(self.manager).\ difference(self.committed_state) @@ -626,6 +627,18 @@ class InstanceState(interfaces.InspectionAttr): difference(self.dict) @property + def unloaded_expirable(self): + """Return the set of keys which do not have a loaded value. + + This includes expired attributes and any other attribute that + was never populated or modified. + + """ + return self.unloaded.intersection( + attr for attr in self.manager + if self.manager[attr].impl.expire_missing) + + @property def _unloaded_non_object(self): return self.unloaded.intersection( attr for attr in self.manager |
