summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2017-09-27 15:47:10 -0400
committerGerrit Code Review <gerrit@ci.zzzcomputing.com>2017-09-27 15:47:10 -0400
commite111852270ee20fbc32934eeefd0883e8ffeaba8 (patch)
treee71e7c3804ff28b893afd6f17ffc4b4b8d1dc1e9 /lib
parent3d50251e0a04a7648c5d3d4c4bee22673fc5660e (diff)
parent5abb036e9b9eba0f61cf9617dea2d879c2d5b09c (diff)
downloadsqlalchemy-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.py2
-rw-r--r--lib/sqlalchemy/orm/state.py13
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