diff options
Diffstat (limited to 'lib/sqlalchemy/orm/strategies.py')
| -rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 92 |
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) |
