summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-05-31 17:17:22 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-05-31 17:17:22 +0000
commit0fec39af8aa6ac86de496c1e99bb32ab1c9cf1c4 (patch)
tree94f907814f24e2c87064fa22872bd2d361bda09a /lib/sqlalchemy
parent4d7941e3b0e80da3a2762c502d79c40eb57c8d45 (diff)
downloadsqlalchemy-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.py13
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)