diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-05-31 17:17:22 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-05-31 17:17:22 +0000 |
| commit | 0fec39af8aa6ac86de496c1e99bb32ab1c9cf1c4 (patch) | |
| tree | 94f907814f24e2c87064fa22872bd2d361bda09a /lib/sqlalchemy | |
| parent | 4d7941e3b0e80da3a2762c502d79c40eb57c8d45 (diff) | |
| download | sqlalchemy-0fec39af8aa6ac86de496c1e99bb32ab1c9cf1c4.tar.gz | |
- significant speed improvement to ResultProxy, pre-caches
TypeEngine dialect implementations and saves on function calls
per column. drops the masseagerload test from 80K function calls
to 66K
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index ca18d1e26..a59e57809 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -857,12 +857,12 @@ class ResultProxy(object): def __init__(self, context): """ResultProxy objects are constructed via the execute() method on SQLEngine.""" self.context = context + self.dialect = context.dialect self.closed = False self.cursor = context.cursor self.__echo = logging.is_debug_enabled(context.engine.logger) self._init_metadata() - dialect = property(lambda s:s.context.dialect) rowcount = property(lambda s:s.context.get_rowcount()) connection = property(lambda s:s.context.connection) @@ -873,14 +873,17 @@ class ResultProxy(object): self.__props = {} self.__keys = [] metadata = self.cursor.description + if metadata is not None: for i, item in enumerate(metadata): # sqlite possibly prepending table name to colnames so strip colname = item[0].split('.')[-1] if self.context.typemap is not None: - rec = (self.context.typemap.get(colname.lower(), types.NULLTYPE), i) + type = self.context.typemap.get(colname.lower(), types.NULLTYPE) else: - rec = (types.NULLTYPE, i) + type = types.NULLTYPE + rec = (type, type.dialect_impl(self.dialect), i) + if rec[0] is None: raise DBAPIError("None for metadata " + colname) if self.__props.setdefault(colname.lower(), rec) is not rec: @@ -989,7 +992,7 @@ class ResultProxy(object): def _get_col(self, row, key): rec = self._convert_key(key) - return rec[0].dialect_impl(self.dialect).convert_result_value(row[rec[1]], self.dialect) + return rec[1].convert_result_value(row[rec[2]], self.dialect) def _fetchone_impl(self): return self.cursor.fetchone() @@ -1101,7 +1104,7 @@ class BufferedColumnResultProxy(ResultProxy): """ def _get_col(self, row, key): rec = self._convert_key(key) - return row[rec[1]] + return row[rec[2]] def _process_row(self, row): sup = super(BufferedColumnResultProxy, self) |
