From ddad19052965b4f1ed75ad0eb33217da18aa81e4 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 19 Jul 2015 16:32:31 -0400 Subject: [PATCH] - 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 --- doc/build/changelog/changelog_10.rst | 11 +++++++++++ lib/sqlalchemy/engine/result.py | 14 ++++++++++++-- test/sql/test_query.py | 12 ++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 1e00ddcd46..a2b4273bf6 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -18,6 +18,17 @@ .. changelog:: :version: 1.0.7 + .. 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 diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py index 3fcab873bf..74a0fce771 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 16ba285b2b..0313a9cd09 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() -- 2.47.3