summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-01-09 10:10:20 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2016-01-09 10:10:20 -0500
commitc7ae0daf0ed24e2697d6f948db2d9fdc5953c795 (patch)
tree424c000be8adb806ebf3198bf32837dbeeb8699c /lib/sqlalchemy
parent89facbed8855d1443dbe37919ff0645aea640ed0 (diff)
downloadsqlalchemy-c7ae0daf0ed24e2697d6f948db2d9fdc5953c795.tar.gz
- Fixed regression since 0.9 where the 0.9 style loader options
system failed to accommodate for multiple :func:`.undefer_group` loader options in a single query. Multiple :func:`.undefer_group` options will now be taken into account even against the same entity. fixes #3623
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/strategies.py2
-rw-r--r--lib/sqlalchemy/orm/strategy_options.py25
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index b60e47bb3..0252a65f9 100644
--- a/lib/sqlalchemy/orm/strategies.py
+++ b/lib/sqlalchemy/orm/strategies.py
@@ -238,7 +238,7 @@ class DeferredColumnLoader(LoaderStrategy):
(
loadopt and
self.group and
- loadopt.local_opts.get('undefer_group', False) == self.group
+ loadopt.local_opts.get('undefer_group_%s' % self.group, False)
)
or
(
diff --git a/lib/sqlalchemy/orm/strategy_options.py b/lib/sqlalchemy/orm/strategy_options.py
index 3467328e3..f08367941 100644
--- a/lib/sqlalchemy/orm/strategy_options.py
+++ b/lib/sqlalchemy/orm/strategy_options.py
@@ -88,6 +88,7 @@ class Load(Generative, MapperOption):
cloned.local_opts = {}
return cloned
+ _merge_into_path = False
strategy = None
propagate_to_loaders = False
@@ -214,7 +215,15 @@ class Load(Generative, MapperOption):
cloned._set_path_strategy()
def _set_path_strategy(self):
- if self.path.has_entity:
+ if self._merge_into_path:
+ # special helper for undefer_group
+ existing = self.path.get(self.context, "loader")
+ if existing:
+ existing.local_opts.update(self.local_opts)
+ else:
+ self.path.set(self.context, "loader", self)
+
+ elif self.path.has_entity:
self.path.parent.set(self.context, "loader", self)
else:
self.path.set(self.context, "loader", self)
@@ -411,11 +420,20 @@ class _UnboundLoad(Load):
if effective_path.is_token:
for path in effective_path.generate_for_superclasses():
- if self._is_chain_link:
+ if self._merge_into_path:
+ # special helper for undefer_group
+ existing = path.get(context, "loader")
+ if existing:
+ existing.local_opts.update(self.local_opts)
+ else:
+ path.set(context, "loader", loader)
+ elif self._is_chain_link:
path.setdefault(context, "loader", loader)
else:
path.set(context, "loader", loader)
else:
+ # only supported for the undefer_group() wildcard opt
+ assert not self._merge_into_path
if self._is_chain_link:
effective_path.setdefault(context, "loader", loader)
else:
@@ -1025,10 +1043,11 @@ def undefer_group(loadopt, name):
:func:`.orm.undefer`
"""
+ loadopt._merge_into_path = True
return loadopt.set_column_strategy(
"*",
None,
- {"undefer_group": name}
+ {"undefer_group_%s" % name: True}
)