.. 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
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()
# 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()