summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES7
-rw-r--r--lib/sqlalchemy/engine/base.py4
-rw-r--r--test/aaa_profiling/test_zoomark.py3
-rw-r--r--test/engine/test_execute.py33
4 files changed, 43 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index c29ea98a4..947395fd9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -210,6 +210,13 @@ CHANGES
The most prominently affected DBAPI
is pyodbc. Also in 0.7.8. [ticket:2489]
+ - [bug] Fixed bug affecting Py3K whereby
+ string positional parameters passed to
+ engine/connection execute() would fail to be
+ interpreted correctly, due to __iter__
+ being present on Py3K string.
+ [ticket:2503]. Also in 0.7.8.
+
- [feature] Added a new system
for registration of new dialects in-process
without using an entrypoint. See the
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index f68c31b97..2e05f532c 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1476,7 +1476,7 @@ class Connection(Connectable):
elif len(multiparams) == 1:
zero = multiparams[0]
if isinstance(zero, (list, tuple)):
- if not zero or hasattr(zero[0], '__iter__'):
+ if not zero or isinstance(zero[0], (list, tuple, dict)):
return zero
else:
return [zero]
@@ -1485,7 +1485,7 @@ class Connection(Connectable):
else:
return [[zero]]
else:
- if hasattr(multiparams[0], '__iter__'):
+ if isinstance(multiparams[0], (list, tuple, dict)):
return multiparams
else:
return [multiparams]
diff --git a/test/aaa_profiling/test_zoomark.py b/test/aaa_profiling/test_zoomark.py
index e1bee2b98..e3ce8d078 100644
--- a/test/aaa_profiling/test_zoomark.py
+++ b/test/aaa_profiling/test_zoomark.py
@@ -377,8 +377,7 @@ class ZooMarkTest(fixtures.TestBase):
def test_profile_2_insert(self):
self.test_baseline_2_insert()
- @profiling.function_call_count(3118, {'2.7':3109,
- '2.7+cextension':3109, '2.6':3109})
+ @profiling.function_call_count(3333)
def test_profile_3_properties(self):
self.test_baseline_3_properties()
diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py
index 610f5e42b..7ccd42b73 100644
--- a/test/engine/test_execute.py
+++ b/test/engine/test_execute.py
@@ -79,6 +79,22 @@ class ExecuteTest(fixtures.TestBase):
(6, 'donkey'),
(7, 'sally'),
]
+ for multiparam, param in [
+ (("jack", "fred"), {}),
+ ((["jack", "fred"],), {})
+ ]:
+ res = conn.execute(
+ "select * from users where user_name=? or "
+ "user_name=? order by user_id",
+ *multiparam, **param)
+ assert res.fetchall() == [
+ (1, 'jack'),
+ (2, 'fred')
+ ]
+ res = conn.execute("select * from users where user_name=?",
+ "jack"
+ )
+ assert res.fetchall() == [(1, 'jack')]
conn.execute('delete from users')
go(testing.db)
@@ -104,6 +120,23 @@ class ExecuteTest(fixtures.TestBase):
res = conn.execute('select * from users order by user_id')
assert res.fetchall() == [(1, 'jack'), (2, 'ed'), (3,
'horse'), (4, 'sally'), (5, None)]
+ for multiparam, param in [
+ (("jack", "ed"), {}),
+ ((["jack", "ed"],), {})
+ ]:
+ res = conn.execute(
+ "select * from users where user_name=%s or "
+ "user_name=%s order by user_id",
+ *multiparam, **param)
+ assert res.fetchall() == [
+ (1, 'jack'),
+ (2, 'ed')
+ ]
+ res = conn.execute("select * from users where user_name=%s",
+ "jack"
+ )
+ assert res.fetchall() == [(1, 'jack')]
+
conn.execute('delete from users')
go(testing.db)
conn = testing.db.connect()