diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-18 05:16:52 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-18 05:16:52 +0000 |
| commit | 79aa1a6b258a84443540b8bb68c8d64deb936ef9 (patch) | |
| tree | dd145ce1240d8d43cca46b8e4047ef397b599e27 /lib/sqlalchemy | |
| parent | 43d476ce60339f3369847191988b96b3f3665f44 (diff) | |
| download | sqlalchemy-79aa1a6b258a84443540b8bb68c8d64deb936ef9.tar.gz | |
fixed both group-deferred attributes and expired attributes to not
blow away changes made on attributes before the load takes place
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/attributes.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 14 |
2 files changed, 10 insertions, 7 deletions
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index 7c760f15a..6cf2b74e9 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -618,7 +618,8 @@ class InstanceState(object): self.callables[key] = callable_ def __fire_trigger(self): - self.trigger(self.obj(), self.expired_attributes) + instance = self.obj() + self.trigger(instance, [k for k in self.expired_attributes if k not in self.dict]) for k in self.expired_attributes: self.callables.pop(k, None) self.expired_attributes.clear() diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index dfd1efa36..eb88c0497 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -100,7 +100,7 @@ class ColumnLoader(LoaderStrategy): strategy = self.parent_property._get_strategy(DeferredColumnLoader) # full list of ColumnProperty objects to be loaded in the deferred fetch - props = [p for p in mapper.iterate_properties if isinstance(p.strategy, ColumnLoader) and p.columns[0].table in needs_tables] + props = [p.key for p in mapper.iterate_properties if isinstance(p.strategy, ColumnLoader) and p.columns[0].table in needs_tables] # TODO: we are somewhat duplicating efforts from mapper._get_poly_select_loader # and should look for ways to simplify. @@ -188,10 +188,12 @@ class DeferredColumnLoader(LoaderStrategy): if props is not None: group = props elif self.group is not None: - group = [p for p in localparent.iterate_properties if isinstance(p.strategy, DeferredColumnLoader) and p.group==self.group] + group = [p.key for p in localparent.iterate_properties if isinstance(p.strategy, DeferredColumnLoader) and p.group==self.group] else: - group = [self.parent_property] - + group = [self.parent_property.key] + + group = [k for k in group if k not in instance.__dict__] + if self._should_log_debug: self.logger.debug("deferred load %s group %s" % (mapperutil.attribute_str(instance, self.key), group and ','.join([p.key for p in group]) or 'None')) @@ -201,10 +203,10 @@ class DeferredColumnLoader(LoaderStrategy): if create_statement is None: ident = instance._instance_key[1] - session.query(localparent)._get(None, ident=ident, only_load_props=[p.key for p in group], refresh_instance=instance) + session.query(localparent)._get(None, ident=ident, only_load_props=group, refresh_instance=instance) else: statement, params = create_statement(instance) - session.query(localparent).from_statement(statement).params(params)._get(None, only_load_props=[p.key for p in group], refresh_instance=instance) + session.query(localparent).from_statement(statement).params(params)._get(None, only_load_props=group, refresh_instance=instance) return attributes.ATTR_WAS_SET return lazyload |
