summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/strategies.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/orm/strategies.py')
-rw-r--r--lib/sqlalchemy/orm/strategies.py92
1 files changed, 47 insertions, 45 deletions
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index bdb17e1d6..86be77ae0 100644
--- a/lib/sqlalchemy/orm/strategies.py
+++ b/lib/sqlalchemy/orm/strategies.py
@@ -62,22 +62,22 @@ class ColumnLoader(LoaderStrategy):
if c not in row:
break
else:
- def execute(instance, row, isnew, ispostselect=None, **flags):
- if isnew or ispostselect:
- if self._should_log_debug:
- self.logger.debug("populating %s with %s/%s..." % (mapperutil.attribute_str(instance, self.key), row.__class__.__name__, self.columns[0].key))
- instance.__dict__[self.key] = self.parent_property.composite_class(*[row[c] for c in self.columns])
- self.logger.debug("Returning active composite column fetcher for %s %s" % (mapper, self.key))
- return (execute, None)
+ def new_execute(instance, row, **flags):
+ if self._should_log_debug:
+ self.logger.debug("populating %s with %s/%s..." % (mapperutil.attribute_str(instance, self.key), row.__class__.__name__, self.columns[0].key))
+ instance.__dict__[self.key] = self.parent_property.composite_class(*[row[c] for c in self.columns])
+ if self._should_log_debug:
+ self.logger.debug("Returning active composite column fetcher for %s %s" % (mapper, self.key))
+ return (new_execute, None, None)
elif self.columns[0] in row:
- def execute(instance, row, isnew, ispostselect=None, **flags):
- if isnew or ispostselect:
- if self._should_log_debug:
- self.logger.debug("populating %s with %s/%s" % (mapperutil.attribute_str(instance, self.key), row.__class__.__name__, self.columns[0].key))
- instance.__dict__[self.key] = row[self.columns[0]]
- self.logger.debug("Returning active column fetcher for %s %s" % (mapper, self.key))
- return (execute, None)
+ def new_execute(instance, row, **flags):
+ if self._should_log_debug:
+ self.logger.debug("populating %s with %s/%s" % (mapperutil.attribute_str(instance, self.key), row.__class__.__name__, self.columns[0].key))
+ instance.__dict__[self.key] = row[self.columns[0]]
+ if self._should_log_debug:
+ self.logger.debug("Returning active column fetcher for %s %s" % (mapper, self.key))
+ return (new_execute, None, None)
# our mapped column is not present in the row. check if we need to initialize a polymorphic
# row fetcher used by inheritance.
@@ -87,15 +87,17 @@ class ColumnLoader(LoaderStrategy):
if hosted_mapper.polymorphic_fetch == 'deferred':
# 'deferred' polymorphic row fetcher, put a callable on the property.
- def execute(instance, row, isnew, **flags):
+ def new_execute(instance, row, isnew, **flags):
if isnew:
sessionlib.attribute_manager.init_instance_attribute(instance, self.key, callable_=self._get_deferred_inheritance_loader(instance, mapper, needs_tables))
- self.logger.debug("Returning deferred column fetcher for %s %s" % (mapper, self.key))
- return (execute, None)
+ if self._should_log_debug:
+ self.logger.debug("Returning deferred column fetcher for %s %s" % (mapper, self.key))
+ return (new_execute, None, None)
else:
# immediate polymorphic row fetcher. no processing needed for this row.
- self.logger.debug("Returning no column fetcher for %s %s" % (mapper, self.key))
- return (None, None)
+ if self._should_log_debug:
+ self.logger.debug("Returning no column fetcher for %s %s" % (mapper, self.key))
+ return (None, None, None)
def _get_deferred_inheritance_loader(self, instance, mapper, needs_tables):
def create_statement():
@@ -125,19 +127,17 @@ class DeferredColumnLoader(LoaderStrategy):
if self.group is not None and selectcontext.attributes.get(('undefer', self.group), False):
return self.parent_property._get_strategy(ColumnLoader).create_row_processor(selectcontext, mapper, row)
elif not self.is_class_level or len(selectcontext.options):
- def execute(instance, row, isnew, **flags):
- if isnew:
- if self._should_log_debug:
- self.logger.debug("set deferred callable on %s" % mapperutil.attribute_str(instance, self.key))
- sessionlib.attribute_manager.init_instance_attribute(instance, self.key, callable_=self.setup_loader(instance))
- return (execute, None)
+ def new_execute(instance, row, **flags):
+ if self._should_log_debug:
+ self.logger.debug("set deferred callable on %s" % mapperutil.attribute_str(instance, self.key))
+ sessionlib.attribute_manager.init_instance_attribute(instance, self.key, callable_=self.setup_loader(instance))
+ return (new_execute, None, None)
else:
- def execute(instance, row, isnew, **flags):
- if isnew:
- if self._should_log_debug:
- self.logger.debug("set deferred callable on %s" % mapperutil.attribute_str(instance, self.key))
- sessionlib.attribute_manager.reset_instance_attribute(instance, self.key)
- return (execute, None)
+ def new_execute(instance, row, **flags):
+ if self._should_log_debug:
+ self.logger.debug("set deferred callable on %s" % mapperutil.attribute_str(instance, self.key))
+ sessionlib.attribute_manager.reset_instance_attribute(instance, self.key)
+ return (new_execute, None, None)
def init(self):
super(DeferredColumnLoader, self).init()
@@ -250,7 +250,7 @@ class DynaLoader(AbstractRelationLoader):
self._register_attribute(self.parent.class_, dynamic=True, target_mapper=self.parent_property.mapper)
def create_row_processor(self, selectcontext, mapper, row):
- return (None, None)
+ return (None, None, None)
DynaLoader.logger = logging.class_logger(DynaLoader)
@@ -260,12 +260,12 @@ class NoLoader(AbstractRelationLoader):
self._register_attribute(self.parent.class_)
def create_row_processor(self, selectcontext, mapper, row):
- def execute(instance, row, isnew, **flags):
- if isnew:
+ def new_execute(instance, row, ispostselect, **flags):
+ if not ispostselect:
if self._should_log_debug:
self.logger.debug("initializing blank scalar/collection on %s" % mapperutil.attribute_str(instance, self.key))
self._init_instance_attribute(instance)
- return (execute, None)
+ return (new_execute, None, None)
NoLoader.logger = logging.class_logger(NoLoader)
@@ -314,7 +314,8 @@ class LazyLoader(AbstractRelationLoader):
return prop._get_strategy(LazyLoader).setup_loader(instance)
def lazyload():
- self.logger.debug("lazy load attribute %s on instance %s" % (self.key, mapperutil.instance_str(instance)))
+ if self._should_log_debug:
+ self.logger.debug("lazy load attribute %s on instance %s" % (self.key, mapperutil.instance_str(instance)))
if not mapper.has_identity(instance):
return None
@@ -362,17 +363,17 @@ class LazyLoader(AbstractRelationLoader):
def create_row_processor(self, selectcontext, mapper, row):
if not self.is_class_level or len(selectcontext.options):
- def execute(instance, row, isnew, **flags):
- if isnew:
+ def new_execute(instance, row, ispostselect, **flags):
+ if not ispostselect:
if self._should_log_debug:
self.logger.debug("set instance-level lazy loader on %s" % mapperutil.attribute_str(instance, self.key))
# we are not the primary manager for this attribute on this class - set up a per-instance lazyloader,
# which will override the class-level behavior
self._init_instance_attribute(instance, callable_=self.setup_loader(instance, selectcontext.options))
- return (execute, None)
+ return (new_execute, None, None)
else:
- def execute(instance, row, isnew, **flags):
- if isnew:
+ def new_execute(instance, row, ispostselect, **flags):
+ if not ispostselect:
if self._should_log_debug:
self.logger.debug("set class-level lazy loader on %s" % mapperutil.attribute_str(instance, self.key))
# we are the primary manager for this attribute on this class - reset its per-instance attribute state,
@@ -380,7 +381,7 @@ class LazyLoader(AbstractRelationLoader):
# this usually is not needed unless the constructor of the object referenced the attribute before we got
# to load data into it.
sessionlib.attribute_manager.reset_instance_attribute(instance, self.key)
- return (execute, None)
+ return (new_execute, None, None)
def _create_lazy_clause(cls, prop, reverse_direction=False):
(primaryjoin, secondaryjoin, remote_side) = (prop.polymorphic_primaryjoin, prop.polymorphic_secondaryjoin, prop.remote_side)
@@ -591,7 +592,7 @@ class EagerLoader(AbstractRelationLoader):
# FIXME: instead of...
sessionlib.attribute_manager.get_attribute(instance, self.key).set_raw_value(instance, self.select_mapper._instance(selectcontext, decorated_row, None))
# bypass and set directly:
- #instance.__dict__[self.key] = ...
+ #instance.__dict__[self.key] = self.select_mapper._instance(selectcontext, decorated_row, None)
else:
# call _instance on the row, even though the object has been created,
# so that we further descend into properties
@@ -614,9 +615,10 @@ class EagerLoader(AbstractRelationLoader):
selectcontext.stack.pop()
selectcontext.stack.pop()
- return (execute, None)
+ return (execute, execute, None)
else:
- self.logger.debug("eager loader %s degrading to lazy loader" % str(self))
+ if self._should_log_debug:
+ self.logger.debug("eager loader %s degrading to lazy loader" % str(self))
selectcontext.stack.pop()
return self.parent_property._get_strategy(LazyLoader).create_row_processor(selectcontext, mapper, row)