diff options
Diffstat (limited to 'lib/sqlalchemy/engine/cursor.py')
-rw-r--r-- | lib/sqlalchemy/engine/cursor.py | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/lib/sqlalchemy/engine/cursor.py b/lib/sqlalchemy/engine/cursor.py index bd46f30ac..7491afc3e 100644 --- a/lib/sqlalchemy/engine/cursor.py +++ b/lib/sqlalchemy/engine/cursor.py @@ -14,6 +14,7 @@ from __future__ import annotations import collections import functools +import operator import typing from typing import Any from typing import cast @@ -1440,39 +1441,46 @@ class CursorResult(Result[_T]): # getter assuming no transformations will be called as this # is the most common case - if echo: - log = self.context.connection._log_debug - - def _log_row(row): - log("Row %r", sql_util._repr_row(row)) - return row - - self._row_logging_fn = log_row = _log_row - else: - log_row = None - metadata = self._init_metadata(context, cursor_description) _make_row = functools.partial( Row, metadata, - metadata._processors, + metadata._effective_processors, metadata._key_to_index, ) - if log_row: + + if context._num_sentinel_cols: + sentinel_filter = operator.itemgetter( + slice(-context._num_sentinel_cols) + ) + + def _sliced_row(raw_data): + return _make_row(sentinel_filter(raw_data)) + + sliced_row = _sliced_row + else: + sliced_row = _make_row + + if echo: + log = self.context.connection._log_debug + + def _log_row(row): + log("Row %r", sql_util._repr_row(row)) + return row + + self._row_logging_fn = _log_row def _make_row_2(row): - made_row = _make_row(row) - assert log_row is not None - log_row(made_row) - return made_row + return _log_row(sliced_row(row)) make_row = _make_row_2 else: - make_row = _make_row + make_row = sliced_row self._set_memoized_attribute("_row_getter", make_row) else: + assert context._num_sentinel_cols == 0 self._metadata = self._no_result_metadata def _init_metadata(self, context, cursor_description): |