summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-02-25 18:28:50 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2015-02-25 18:28:50 -0500
commiteb6e7daf8e546ec13d6d9a9693056451de55a309 (patch)
tree9667b1e98fce5f06f43c8d6522a2b53dcf012714
parentf9b479b640365d61156e18991f39201118a3835d (diff)
downloadsqlalchemy-eb6e7daf8e546ec13d6d9a9693056451de55a309.tar.gz
- textual approach
-rw-r--r--lib/sqlalchemy/engine/result.py9
-rw-r--r--lib/sqlalchemy/orm/loading.py8
-rw-r--r--lib/sqlalchemy/orm/query.py25
3 files changed, 32 insertions, 10 deletions
diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py
index 3995942ef..7a8067f1e 100644
--- a/lib/sqlalchemy/engine/result.py
+++ b/lib/sqlalchemy/engine/result.py
@@ -337,7 +337,7 @@ class ResultMetaData(object):
else:
return self._key_fallback(key, False) is not None
- def _getter(self, key):
+ def _index_of(self, key):
if key in self._keymap:
processor, obj, index = self._keymap[key]
else:
@@ -351,6 +351,10 @@ class ResultMetaData(object):
"Ambiguous column name '%s' in result set! "
"try 'use_labels' option on select statement." % key)
+ return index
+
+ def _getter(self, key):
+ index = self._index_of(key)
return operator.itemgetter(index)
def __getstate__(self):
@@ -414,6 +418,9 @@ class ResultProxy(object):
context.engine._should_log_debug()
self._init_metadata()
+ def _index_of(self, key):
+ return self._metadata._index_of(key)
+
def _getter(self, key):
return self._metadata._getter(key)
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py
index 6046436c8..818b11b35 100644
--- a/lib/sqlalchemy/orm/loading.py
+++ b/lib/sqlalchemy/orm/loading.py
@@ -42,6 +42,14 @@ def instances(query, cursor, context):
def filter_fn(row):
return tuple(fn(x) for x, fn in zip(row, filter_fns))
+ if context.statement is not None:
+ context._setup_column_processors(
+ [
+ (cursor._index_of(col), col)
+ for col in context.primary_columns + context.secondary_columns
+ ]
+ )
+
try:
(labels, process) = list(zip(*context.loaders))
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index da44d41b5..97378dbfc 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -2935,9 +2935,6 @@ class Query(object):
def _compile_context(self, labels=True):
context = QueryContext(self)
- if context.statement is not None:
- return context
-
context.labels = labels
context._for_update_arg = self._for_update_arg
@@ -2945,6 +2942,9 @@ class Query(object):
for entity in self._entities:
entity.setup_context(self, context)
+ if context.statement is not None:
+ return context
+
for rec in context.create_eager_joins:
strategy = rec[0]
strategy(*rec[1:])
@@ -3044,13 +3044,14 @@ class Query(object):
statement.append_order_by(*context.eager_order_by)
- for idx, col in enumerate(context.primary_columns, 0):
- context.column_processors[col](idx)
-
- for idx, col in enumerate(
+ context._setup_column_processors(
+ enumerate(context.primary_columns, 0)
+ )
+ context._setup_column_processors(
+ enumerate(
context.secondary_columns,
- len(context.primary_columns) + len(order_by_col_expr)):
- context.column_processors[col](idx)
+ len(context.primary_columns) + len(order_by_col_expr))
+ )
return statement
@@ -3277,6 +3278,7 @@ class _MapperEntity(_QueryEntity):
# TODO: this was part of concrete, how does this apply
# now? At least for textual, something is needed.
+ # (or do we?)
# if not adapter and self.mapper._requires_row_aliasing:
# adapter = sql_util.ColumnAdapter(
# self.selectable,
@@ -3696,6 +3698,7 @@ class QueryContext(object):
adapter = None
froms = ()
for_update = None
+ order_by = False
def __init__(self, query):
@@ -3729,6 +3732,10 @@ class QueryContext(object):
self.attributes = query._attributes.copy()
self.loaders = []
+ def _setup_column_processors(self, cols):
+ for idx, col in cols:
+ self.column_processors[col](idx)
+
class AliasOption(interfaces.MapperOption):