summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-07-19 16:32:31 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-07-19 16:32:31 -0400
commitddad19052965b4f1ed75ad0eb33217da18aa81e4 (patch)
tree77a0c6f3c2d4fda70cef6850ffa9d564156014cc
parentc00ef11a0c1472f7469fcbadf42e7117bd6869d4 (diff)
downloadsqlalchemy-ddad19052965b4f1ed75ad0eb33217da18aa81e4.tar.gz
- Fixed regression where new methods on :class:`.ResultProxy` used
by the ORM :class:`.Query` object (part of the performance enhancements of :ticket:`3175`) would not raise the "this result does not return rows" exception in the case where the driver (typically MySQL) fails to generate cursor.description correctly; an AttributeError against NoneType would be raised instead. fixes #3481
-rw-r--r--doc/build/changelog/changelog_10.rst11
-rw-r--r--lib/sqlalchemy/engine/result.py14
-rw-r--r--test/sql/test_query.py12
3 files changed, 33 insertions, 4 deletions
diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst
index 1e00ddcd4..a2b4273bf 100644
--- a/doc/build/changelog/changelog_10.rst
+++ b/doc/build/changelog/changelog_10.rst
@@ -20,6 +20,17 @@
.. change::
:tags: bug, engine
+ :tickets: 3481
+
+ Fixed regression where new methods on :class:`.ResultProxy` used
+ by the ORM :class:`.Query` object (part of the performance
+ enhancements of :ticket:`3175`) would not raise the "this result
+ does not return rows" exception in the case where the driver
+ (typically MySQL) fails to generate cursor.description correctly;
+ an AttributeError against NoneType would be raised instead.
+
+ .. change::
+ :tags: bug, engine
:tickets: 3483
Fixed regression where :meth:`.ResultProxy.keys` would return
diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py
index 3fcab873b..74a0fce77 100644
--- a/lib/sqlalchemy/engine/result.py
+++ b/lib/sqlalchemy/engine/result.py
@@ -495,10 +495,20 @@ class ResultProxy(object):
self._init_metadata()
def _getter(self, key):
- return self._metadata._getter(key)
+ try:
+ getter = self._metadata._getter
+ except AttributeError:
+ return self._non_result(None)
+ else:
+ return getter(key)
def _has_key(self, key):
- return self._metadata._has_key(key)
+ try:
+ has_key = self._metadata._has_key
+ except AttributeError:
+ return self._non_result(None)
+ else:
+ return has_key(key)
def _init_metadata(self):
metadata = self._cursor_description()
diff --git a/test/sql/test_query.py b/test/sql/test_query.py
index 16ba285b2..0313a9cd0 100644
--- a/test/sql/test_query.py
+++ b/test/sql/test_query.py
@@ -976,14 +976,22 @@ class QueryTest(fixtures.TestBase):
# result.BufferedColumnResultProxy
conn = testing.db.connect()
- for meth in ('fetchone', 'fetchall', 'first', 'scalar', 'fetchmany'):
+ for meth in [
+ lambda r: r.fetchone(),
+ lambda r: r.fetchall(),
+ lambda r: r.first(),
+ lambda r: r.scalar(),
+ lambda r: r.fetchmany(),
+ lambda r: r._getter('user'),
+ lambda r: r._has_key('user'),
+ ]:
trans = conn.begin()
result = conn.execute(users.insert(), user_id=1)
assert_raises_message(
exc.ResourceClosedError,
"This result object does not return rows. "
"It has been closed automatically.",
- getattr(result, meth),
+ meth, result,
)
trans.rollback()