#1914: "immediateload" lazy option
-------------------------+--------------------------------------------------
Reporter: zzzeek | Owner: zzzeek
Type: enhancement | Status: new
Priority: medium | Milestone: 0.6.5
Component: orm | Severity: minor - half an hour
Keywords: | Status_field: needs tests
-------------------------+--------------------------------------------------
this is the most super easy win ever. fire the lazyloader off during
the query.
{{{
#!diff
diff -r 2cc844408821 lib/sqlalchemy/orm/__init__.py
--- a/lib/sqlalchemy/orm/__init__.py Mon Sep 13 02:39:39 2010 -0400
+++ b/lib/sqlalchemy/orm/__init__.py Mon Sep 13 12:10:14 2010 -0400
@@ -84,6 +84,7 @@
'eagerload',
'eagerload_all',
'extension',
+ 'immediateload',
'join',
'joinedload',
'joinedload_all',
@@ -1110,7 +1111,7 @@
query.options(subqueryload_all(User.orders, Order.items,
Item.keywords))
- See also: :func:`joinedload_all`, :func:`lazyload`
+ See also: :func:`joinedload_all`, :func:`lazyload`,
:func:`immediateload`
"""
return strategies.EagerLazyOption(keys, lazy="subquery",
chained=True)
@@ -1122,7 +1123,7 @@
Used with :meth:`~sqlalchemy.orm.query.Query.options`.
- See also: :func:`eagerload`, :func:`subqueryload`
+ See also: :func:`eagerload`, :func:`subqueryload`,
:func:`immediateload`
"""
return strategies.EagerLazyOption(keys, lazy=True)
@@ -1133,11 +1134,22 @@
Used with :meth:`~sqlalchemy.orm.query.Query.options`.
- See also: :func:`lazyload`, :func:`eagerload`, :func:`subqueryload`
+ See also: :func:`lazyload`, :func:`eagerload`, :func:`subqueryload`,
:func:`immediateload`
"""
return strategies.EagerLazyOption(keys, lazy=None)
+def immediateload(*keys):
+ """Return a ``MapperOption`` that will convert the property of the
given
+ name into an immediate load.
+
+ Used with :meth:`~sqlalchemy.orm.query.Query.options`.
+
+ See also: :func:`lazyload`, :func:`eagerload`, :func:`subqueryload`
+
+ """
+ return strategies.EagerLazyOption(keys, lazy='immediate')
+
def contains_alias(alias):
"""Return a ``MapperOption`` that will indicate to the query that
the main table has been aliased.
diff -r 2cc844408821 lib/sqlalchemy/orm/strategies.py
--- a/lib/sqlalchemy/orm/strategies.py Mon Sep 13 02:39:39 2010 -0400
+++ b/lib/sqlalchemy/orm/strategies.py Mon Sep 13 12:10:14 2010 -0400
@@ -683,6 +683,23 @@
else:
return None
+class ImmediateLoader(AbstractRelationshipLoader):
+ def init_class_attribute(self, mapper):
+ self.parent_property.\
+ _get_strategy(LazyLoader).\
+ init_class_attribute(mapper)
+
+ def setup_query(self, context, entity,
+ path, adapter, column_collection=None,
+ parentmapper=None, **kwargs):
+ pass
+
+ def create_row_processor(self, context, path, mapper, row, adapter):
+ def execute(state, dict_, row):
+ state.get_impl(self.key).get(state, dict_)
+
+ return execute, execute
+
class SubqueryLoader(AbstractRelationshipLoader):
def init(self):
super(SubqueryLoader, self).init()
@@ -1220,6 +1237,8 @@
return LazyLoader
elif identifier == 'subquery':
return SubqueryLoader
+ elif identifier == 'immediate':
+ return ImmediateLoader
else:
return LazyLoader
}}}
--
Ticket URL: <http://www.sqlalchemy.org/trac/ticket/1914>
sqlalchemy <http://www.sqlalchemy.org/>
The Database Toolkit for Python
|