From e97211413e9282b62d9494e7bbdc1c3040dff2c4 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 23 Dec 2005 04:44:44 +0000 Subject: added defer and undefer mapper options --- lib/sqlalchemy/mapping/__init__.py | 10 ++++++++++ lib/sqlalchemy/mapping/properties.py | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/mapping/__init__.py b/lib/sqlalchemy/mapping/__init__.py index 3217e283e..f5d635213 100644 --- a/lib/sqlalchemy/mapping/__init__.py +++ b/lib/sqlalchemy/mapping/__init__.py @@ -29,6 +29,7 @@ from properties import * import mapper as mapperlib __all__ = ['relation', 'eagerload', 'lazyload', 'noload', 'deferred', 'assignmapper', 'column', 'deferred', + 'defer', 'undefer', 'mapper', 'clear_mappers', 'objectstore', 'sql', 'extension', 'class_mapper', 'object_mapper', 'MapperExtension', 'ColumnProperty', 'assign_mapper' ] @@ -137,6 +138,15 @@ def noload(name, **kwargs): """returns a MapperOption that will convert the property of the given name into a non-load. Used with mapper.options()""" return EagerLazyOption(name, toeager=None, **kwargs) + +def defer(name, **kwargs): + """returns a MapperOption that will convert the column property of the given + name into a deferred load. Used with mapper.options()""" + return DeferredOption(name, defer=True) +def undefer(name, **kwargs): + """returns a MapperOption that will convert the column property of the given + name into a non-deferred (regular column) load. Used with mapper.options.""" + return DeferredOption(name, defer=False) def object_mapper(object): """given an object, returns the primary Mapper associated with the object diff --git a/lib/sqlalchemy/mapping/properties.py b/lib/sqlalchemy/mapping/properties.py index 41236261e..b7b59508e 100644 --- a/lib/sqlalchemy/mapping/properties.py +++ b/lib/sqlalchemy/mapping/properties.py @@ -87,7 +87,7 @@ class DeferredColumnProperty(ColumnProperty): if self.group is not None: groupcols = [p for p in self.parent.props.values() if isinstance(p, DeferredColumnProperty) and p.group==self.group] - row = sql.select([g.columns[0] for g in groupcols], clause).execute().fetchone() + row = sql.select([g.columns[0] for g in groupcols], clause, use_labels=True).execute().fetchone() for prop in groupcols: if prop is self: continue @@ -95,7 +95,7 @@ class DeferredColumnProperty(ColumnProperty): objectstore.global_attributes.create_history(instance, prop.key, uselist=False) return row[self.columns[0]] else: - return sql.select([self.columns[0]], clause).scalar() + return sql.select([self.columns[0]], clause, use_labels=True).scalar() return lazyload def _is_primary(self): @@ -819,6 +819,21 @@ class EagerLazyOption(GenericOption): kwargs = util.constructor_args(mapper.props[key], **self.kwargs) mapper.set_property(key, class_(**kwargs )) +class DeferredOption(GenericOption): + def __init__(self, key, defer=False, **kwargs): + self.key = key + self.defer = defer + self.kwargs = kwargs + def hash_key(self): + return "DeferredOption(%s,%s)" % (self.key, self.defer) + def create_prop(self, mapper, key): + oldprop = mapper.props[key] + if self.defer: + prop = DeferredColumnProperty(*oldprop.columns, **self.kwargs) + else: + prop = ColumnProperty(*oldprop.columns, **self.kwargs) + mapper.set_property(key, prop) + class Aliasizer(sql.ClauseVisitor): """converts a table instance within an expression to be an alias of that table.""" def __init__(self, *tables, **kwargs): -- cgit v1.2.1