diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2005-12-23 04:44:44 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2005-12-23 04:44:44 +0000 |
| commit | e97211413e9282b62d9494e7bbdc1c3040dff2c4 (patch) | |
| tree | f7becd0f328cc5f98459ba5d1d93e9c7ff9e3834 /lib/sqlalchemy | |
| parent | 3ec0043ec15d5973c5977a43ae3effcbec32536c (diff) | |
| download | sqlalchemy-e97211413e9282b62d9494e7bbdc1c3040dff2c4.tar.gz | |
added defer and undefer mapper options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/mapping/__init__.py | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/mapping/properties.py | 19 |
2 files changed, 27 insertions, 2 deletions
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): |
