summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-06-04 20:52:30 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2011-06-04 20:52:30 -0400
commit09080baad1a9f910a5a406dfad9241104ccbc6d8 (patch)
tree97bdbcc41d914e83cecede45033dd91732748e77
parentc0f922116004d762991bdfe56da31d3b70e8c01d (diff)
downloadsqlalchemy-09080baad1a9f910a5a406dfad9241104ccbc6d8.tar.gz
- 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.
-rw-r--r--CHANGES8
-rw-r--r--lib/sqlalchemy/engine/base.py16
-rw-r--r--lib/sqlalchemy/sql/expression.py9
-rw-r--r--test/aaa_profiling/test_resultset.py8
-rw-r--r--test/sql/test_query.py19
5 files changed, 52 insertions, 8 deletions
diff --git a/CHANGES b/CHANGES
index 22e6a5d2b..2014abf94 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 e23465c22..04636b5e5 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 38eb71da8..ec0801405 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 e2c6ecd50..451912c8f 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 c295cd282..359123f57 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