diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-09-24 19:27:52 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-09-24 19:27:52 +0000 |
commit | a0838e0c476f7deab5b67f431c8ce107974b9313 (patch) | |
tree | 5a990b0a2f87f142bf96c75fa7c2597198f887f7 /lib/sqlalchemy/engine/base.py | |
parent | 6b5543995b66b524097ad540a0a3f9dfd9eb9413 (diff) | |
download | sqlalchemy-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.py | 17 |
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))) |