summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-03-14 14:34:36 -0700
committerMike Bayer <mike_mp@zzzcomputing.com>2012-03-14 14:34:36 -0700
commit7ad0c8cb2b76c1de223787785cf5c77d43192db2 (patch)
tree982a78930cc21b60c02d1cbfb7782b9bd8873cc7
parent667f8f83fe2d41a7b53d854b3dbc45bd2cd9fbb0 (diff)
downloadsqlalchemy-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--CHANGES7
-rw-r--r--lib/sqlalchemy/cextension/resultproxy.c11
-rw-r--r--lib/sqlalchemy/engine/base.py1
-rw-r--r--test/sql/test_query.py13
4 files changed, 30 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 98410bbea..67e5335ee 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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(