summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/base.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-05-27 00:13:12 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-05-27 00:13:12 +0000
commit3b5ba3870ee5a27d10422b29befebc1143a7f571 (patch)
tree2c56e4495dfff8f56af8fbc464a537143e8176f0 /lib/sqlalchemy/engine/base.py
parent8270e0a4580bd33a55252fe2955e3cb189b6a498 (diff)
downloadsqlalchemy-3b5ba3870ee5a27d10422b29befebc1143a7f571.tar.gz
added has_key to RowProxy, + caching of key lookups
fix for mapper translate_row for deferred columns continuing with the "polymorph-tizing" of the unit of work, dependency processing accesses objects on each target task polymorphically
Diffstat (limited to 'lib/sqlalchemy/engine/base.py')
-rw-r--r--lib/sqlalchemy/engine/base.py42
1 files changed, 31 insertions, 11 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index bf7b1c20d..83dfad04f 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -506,6 +506,7 @@ class ResultProxy:
self.closed = False
self.executioncontext = executioncontext
self.echo = engine.echo=="debug"
+ self.__key_cache = {}
if executioncontext:
self.rowcount = executioncontext.get_rowcount(cursor)
else:
@@ -534,19 +535,36 @@ class ResultProxy:
self.closed = True
if self.connection.should_close_with_result and self.dialect.supports_autoclose_results:
self.connection.close()
- def _get_col(self, row, key):
- if isinstance(key, sql.ColumnElement):
- try:
- rec = self.props[key._label.lower()]
- except KeyError:
+
+ def _convert_key(self, key):
+ """given a key, which could be a ColumnElement, string, etc., matches it to the
+ appropriate key we got from the result set's metadata; then cache it locally for quick re-access."""
+ try:
+ return self.__key_cache[key]
+ except KeyError:
+ if isinstance(key, sql.ColumnElement):
try:
- rec = self.props[key.key.lower()]
+ rec = self.props[key._label.lower()]
except KeyError:
- rec = self.props[key.name.lower()]
- elif isinstance(key, str):
- rec = self.props[key.lower()]
- else:
- rec = self.props[key]
+ try:
+ rec = self.props[key.key.lower()]
+ except KeyError:
+ rec = self.props[key.name.lower()]
+ elif isinstance(key, str):
+ rec = self.props[key.lower()]
+ else:
+ rec = self.props[key]
+ self.__key_cache[key] = rec
+ return rec
+ def _has_key(self, row, key):
+ try:
+ self._convert_key(key)
+ return True
+ except KeyError:
+ return False
+
+ 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)
def __iter__(self):
@@ -605,6 +623,8 @@ class RowProxy:
return (other is self) or (other == tuple([self.__parent._get_col(self.__row, key) for key in range(0, len(self.__row))]))
def __repr__(self):
return repr(tuple([self.__parent._get_col(self.__row, key) for key in range(0, len(self.__row))]))
+ def has_key(self, key):
+ return self.__parent._has_key(self.__row, key)
def __getitem__(self, key):
return self.__parent._get_col(self.__row, key)
def __getattr__(self, name):