summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/base.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-09-24 19:27:52 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-09-24 19:27:52 +0000
commita0838e0c476f7deab5b67f431c8ce107974b9313 (patch)
tree5a990b0a2f87f142bf96c75fa7c2597198f887f7 /lib/sqlalchemy/engine/base.py
parent6b5543995b66b524097ad540a0a3f9dfd9eb9413 (diff)
downloadsqlalchemy-a0838e0c476f7deab5b67f431c8ce107974b9313.tar.gz
- columns from Alias objects, when used to target result-row columns, must match exactly
to the label used in the generated statement. This is so searching for columns in a result row which match aliases won't accidentally match non-aliased columns. fixes errors which can arise in eager loading scenarios.
Diffstat (limited to 'lib/sqlalchemy/engine/base.py')
-rw-r--r--lib/sqlalchemy/engine/base.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index cc2ea6d5d..7e9d57d97 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1287,10 +1287,19 @@ class ResultProxy(object):
elif isinstance(key, basestring) and key.lower() in props:
rec = props[key.lower()]
elif isinstance(key, expression.ColumnElement):
- label = context.column_labels.get(key._label, key.name).lower()
- if label in props:
- rec = props[label]
-
+ try:
+ if getattr(key, '_exact_match', False):
+ # exact match flag means the label must be present in the
+ # generated column_labels
+ label = context.column_labels[key._label].lower()
+ else:
+ # otherwise, fall back to the straight name of the column
+ # if not in generated labels
+ label = context.column_labels.get(key._label, key.name).lower()
+ if label in props:
+ rec = props[label]
+ except KeyError:
+ pass
if not "rec" in locals():
raise exceptions.NoSuchColumnError("Could not locate column in row for column '%s'" % (str(key)))