diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-07-19 16:32:31 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-07-19 16:32:31 -0400 |
commit | ddad19052965b4f1ed75ad0eb33217da18aa81e4 (patch) | |
tree | 77a0c6f3c2d4fda70cef6850ffa9d564156014cc | |
parent | c00ef11a0c1472f7469fcbadf42e7117bd6869d4 (diff) | |
download | sqlalchemy-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.rst | 11 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/result.py | 14 | ||||
-rw-r--r-- | 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 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() |