diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-03-14 14:34:36 -0700 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-03-14 14:34:36 -0700 |
commit | 7ad0c8cb2b76c1de223787785cf5c77d43192db2 (patch) | |
tree | 982a78930cc21b60c02d1cbfb7782b9bd8873cc7 | |
parent | 667f8f83fe2d41a7b53d854b3dbc45bd2cd9fbb0 (diff) | |
download | sqlalchemy-7ad0c8cb2b76c1de223787785cf5c77d43192db2.tar.gz |
- [bug] Fixed issue whereby attribute-based
column access on a row would raise
AttributeError with non-C version,
NoSuchColumnError with C version. Now
raises AttributeError in both cases.
[ticket:2398]
-rw-r--r-- | CHANGES | 7 | ||||
-rw-r--r-- | lib/sqlalchemy/cextension/resultproxy.c | 11 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 1 | ||||
-rw-r--r-- | test/sql/test_query.py | 13 |
4 files changed, 30 insertions, 2 deletions
@@ -93,6 +93,13 @@ CHANGES in particular when orm query.count() were called. [ticket:2427] + - [bug] Fixed issue whereby attribute-based + column access on a row would raise + AttributeError with non-C version, + NoSuchColumnError with C version. Now + raises AttributeError in both cases. + [ticket:2398] + - [feature] Added support for SQL standard common table expressions (CTE), allowing SELECT objects as the CTE source (DML diff --git a/lib/sqlalchemy/cextension/resultproxy.c b/lib/sqlalchemy/cextension/resultproxy.c index 325007c11..3494ccae6 100644 --- a/lib/sqlalchemy/cextension/resultproxy.c +++ b/lib/sqlalchemy/cextension/resultproxy.c @@ -353,7 +353,16 @@ BaseRowProxy_getattro(BaseRowProxy *self, PyObject *name) else return tmp; - return BaseRowProxy_subscript(self, name); + tmp = BaseRowProxy_subscript(self, name); + if (tmp == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) { + PyErr_Format( + PyExc_AttributeError, + "Could not locate column in row for column '%.200s'", + PyString_AsString(name) + ); + return NULL; + } + return tmp; } /*********************** diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 7cc5522c4..d16fc9c68 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -2623,7 +2623,6 @@ except ImportError: def __getattr__(self, name): try: - # TODO: no test coverage here return self[name] except KeyError, e: raise AttributeError(e.args[0]) diff --git a/test/sql/test_query.py b/test/sql/test_query.py index 50e7eece7..9f0c2dab0 100644 --- a/test/sql/test_query.py +++ b/test/sql/test_query.py @@ -749,6 +749,19 @@ class QueryTest(fixtures.TestBase): eq_(r[users.c.user_name], 'jack') eq_(r.user_name, 'jack') + def test_column_accessor_err(self): + r = testing.db.execute(select([1])).first() + assert_raises_message( + AttributeError, + "Could not locate column in row for column 'foo'", + getattr, r, "foo" + ) + assert_raises_message( + KeyError, + "Could not locate column in row for column 'foo'", + lambda: r['foo'] + ) + @testing.requires.dbapi_lastrowid def test_native_lastrowid(self): r = testing.db.execute( |