summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2005-12-23 04:44:44 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2005-12-23 04:44:44 +0000
commite97211413e9282b62d9494e7bbdc1c3040dff2c4 (patch)
treef7becd0f328cc5f98459ba5d1d93e9c7ff9e3834 /lib/sqlalchemy
parent3ec0043ec15d5973c5977a43ae3effcbec32536c (diff)
downloadsqlalchemy-e97211413e9282b62d9494e7bbdc1c3040dff2c4.tar.gz
added defer and undefer mapper options
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/mapping/__init__.py10
-rw-r--r--lib/sqlalchemy/mapping/properties.py19
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):