From: Mike Bayer Date: Sun, 5 Jun 2011 00:57:16 +0000 (-0400) Subject: - Adjusted the __contains__() method of X-Git-Tag: rel_0_6_8~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=da043fa75207ee5052af7ff1ae31c627e38d6d5c;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Adjusted the __contains__() method of a RowProxy result row such that no exception throw is generated internally; NoSuchColumnError() also will generate its message regardless of whether or not the column construct can be coerced to a string. [ticket:2178]. --- diff --git a/CHANGES b/CHANGES index 1f86681fe5..da822abd92 100644 --- a/CHANGES +++ b/CHANGES @@ -69,6 +69,15 @@ CHANGES break an ORM column_property() mapping against another column_property(). [ticket:2167]. +- engine + - Adjusted the __contains__() method of + a RowProxy result row such that no exception + throw is generated internally; + NoSuchColumnError() also will generate its + message regardless of whether or not the column + construct can be coerced to a string. + [ticket:2178]. + - postgresql - Fixed bug affecting PG 9 whereby index reflection diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 240651c65c..a3ed5bac16 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -2174,7 +2174,7 @@ class ResultMetaData(object): self.logger.debug( "Col %r", tuple(x[0] for x in metadata)) - def _key_fallback(self, key): + def _key_fallback(self, key, raiseerr=True): map = self._keymap result = None if isinstance(key, basestring): @@ -2188,8 +2188,12 @@ class ResultMetaData(object): elif hasattr(key, 'name') and key.name.lower() in map: result = map[key.name.lower()] if result is None: - raise exc.NoSuchColumnError( - "Could not locate column in row for column '%s'" % key) + if raiseerr: + raise exc.NoSuchColumnError( + "Could not locate column in row for column '%s'" % + expression._string_or_unprintable(key)) + else: + return None else: map[key] = result return result @@ -2198,11 +2202,7 @@ class ResultMetaData(object): if key in self._keymap: return True else: - try: - self._key_fallback(key) - return True - except exc.NoSuchColumnError: - return False + return self._key_fallback(key, False) is not None def __len__(self): return len(self.keys) diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 75e33b6b4d..30d713f2f0 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1051,6 +1051,15 @@ def _escape_for_generated(x): else: return x.replace('%', '%%') +def _string_or_unprintable(element): + if isinstance(element, basestring): + return element + else: + try: + return str(element) + except: + return "unprintable element %r" % element + def _clone(element): return element._clone() diff --git a/test/aaa_profiling/test_resultset.py b/test/aaa_profiling/test_resultset.py index bd9d3ae50f..b32492e39a 100644 --- a/test/aaa_profiling/test_resultset.py +++ b/test/aaa_profiling/test_resultset.py @@ -40,3 +40,11 @@ class ResultSetTest(TestBase, AssertsExecutionResults): '2.6+cextension': 409, '2.7+cextension':409}) def test_unicode(self): [tuple(row) for row in t2.select().execute().fetchall()] + + def test_contains_doesnt_compile(self): + row = t.select().execute().first() + c1 = Column('some column', Integer) + Column("some other column", Integer) + @profiling.function_call_count(9) + def go(): + c1 in row + go() diff --git a/test/sql/test_query.py b/test/sql/test_query.py index 2b4e7a71ae..4428a65be1 100644 --- a/test/sql/test_query.py +++ b/test/sql/test_query.py @@ -341,6 +341,25 @@ class QueryTest(TestBase): assert_raises(exc.NoSuchColumnError, lambda: result[0]['fake key']) assert_raises(exc.NoSuchColumnError, lambda: result[0][addresses.c.address_id]) + def test_column_error_printing(self): + row = testing.db.execute(select([1])).first() + class unprintable(object): + def __str__(self): + raise ValueError("nope") + + msg = r"Could not locate column in row for column '%s'" + + for accessor, repl in [ + ("x", "x"), + (Column("q", Integer), "q"), + (Column("q", Integer) + 12, r"q \+ :q_1"), + (unprintable(), "unprintable element.*"), + ]: + assert_raises_message( + exc.NoSuchColumnError, + msg % repl, + lambda: row[accessor] + ) @testing.requires.boolean_col_expressions