diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-02-25 18:28:50 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-02-25 18:28:50 -0500 |
commit | eb6e7daf8e546ec13d6d9a9693056451de55a309 (patch) | |
tree | 9667b1e98fce5f06f43c8d6522a2b53dcf012714 | |
parent | f9b479b640365d61156e18991f39201118a3835d (diff) | |
download | sqlalchemy-eb6e7daf8e546ec13d6d9a9693056451de55a309.tar.gz |
- textual approach
-rw-r--r-- | lib/sqlalchemy/engine/result.py | 9 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 8 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/query.py | 25 |
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): |