From: Mike Bayer Date: Sun, 5 Jun 2011 00:52:30 +0000 (-0400) Subject: - Adjusted the __contains__() method of X-Git-Tag: rel_0_7_1~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09080baad1a9f910a5a406dfad9241104ccbc6d8;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]. Also in 0.6.8. --- diff --git a/CHANGES b/CHANGES index 22e6a5d2b9..2014abf94e 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,14 @@ CHANGES and are redundant: reflecttable(), create(), drop(), text(), engine.func + - 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]. Also in 0.6.8. + - sqlite - Accept None from cursor.fetchone() when "PRAGMA read_uncommitted" is called to determine diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index e23465c224..04636b5e57 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -2578,7 +2578,7 @@ class ResultMetaData(object): if self._keymap.setdefault(name, rec) is not rec: self._keymap[name] = (processor, None) - def _key_fallback(self, key): + def _key_fallback(self, key, raiseerr=True): map = self._keymap result = None if isinstance(key, basestring): @@ -2592,8 +2592,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 @@ -2602,11 +2606,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 __getstate__(self): return { diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 38eb71da87..ec08014053 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1207,6 +1207,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 e2c6ecd500..451912c8f0 100644 --- a/test/aaa_profiling/test_resultset.py +++ b/test/aaa_profiling/test_resultset.py @@ -52,6 +52,14 @@ class ResultSetTest(fixtures.TestBase, AssertsExecutionResults): 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() + class ExecutionTest(fixtures.TestBase): __requires__ = 'cpython', __only_on__ = 'sqlite' diff --git a/test/sql/test_query.py b/test/sql/test_query.py index c295cd2825..359123f57c 100644 --- a/test/sql/test_query.py +++ b/test/sql/test_query.py @@ -341,6 +341,25 @@ class QueryTest(fixtures.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