From: Mike Bayer Date: Sun, 19 Jul 2015 20:32:31 +0000 (-0400) Subject: - Fixed regression where new methods on :class:`.ResultProxy` used X-Git-Tag: rel_1_0_7~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddad19052965b4f1ed75ad0eb33217da18aa81e4;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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 --- 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()