summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-12-28 20:58:38 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-12-28 20:58:38 +0000
commit7009653aa1c53d1f761501522d55617d3fdcc57c (patch)
tree159c2801acdfdd812ad82f8349be8e6f4ce0e1d9
parentd245397bd2ba562993f1c9b5880f1c818050585c (diff)
downloadsqlalchemy-7009653aa1c53d1f761501522d55617d3fdcc57c.tar.gz
- RowProxy objects can be used in place of dictionary arguments
sent to connection.execute() and friends. [ticket:935]
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/engine/base.py6
-rw-r--r--test/sql/query.py27
3 files changed, 32 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index fd3dfd0fa..4f2f07f67 100644
--- a/CHANGES
+++ b/CHANGES
@@ -38,6 +38,10 @@ CHANGES
classes used for both the dynamic collection and the queries
built from it.
+- sql
+ - RowProxy objects can be used in place of dictionary arguments
+ sent to connection.execute() and friends. [ticket:935]
+
- mssql
- Added in new types: MSVarBinary and MSImage. [ticket:1249]
- Added in the MSReal and MSNText types.
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 7af74ec7b..24fd1cc6e 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -835,16 +835,16 @@ class Connection(Connectable):
elif len(multiparams) == 1:
zero = multiparams[0]
if isinstance(zero, (list, tuple)):
- if not zero or isinstance(zero[0], (list, tuple, dict)):
+ if not zero or hasattr(zero[0], '__iter__'):
return zero
else:
return [zero]
- elif isinstance(zero, dict):
+ elif hasattr(zero, 'keys'):
return [zero]
else:
return [[zero]]
else:
- if isinstance(multiparams[0], (list, tuple, dict)):
+ if hasattr(multiparams[0], '__iter__'):
return multiparams
else:
return [multiparams]
diff --git a/test/sql/query.py b/test/sql/query.py
index acfe4a4b0..e62dfa076 100644
--- a/test/sql/query.py
+++ b/test/sql/query.py
@@ -9,7 +9,7 @@ from testlib import *
class QueryTest(TestBase):
def setUpAll(self):
- global users, addresses, metadata
+ global users, users2, addresses, metadata
metadata = MetaData(testing.db)
users = Table('query_users', metadata,
Column('user_id', INT, primary_key = True),
@@ -19,11 +19,17 @@ class QueryTest(TestBase):
Column('address_id', Integer, primary_key=True),
Column('user_id', Integer, ForeignKey('query_users.user_id')),
Column('address', String(30)))
+
+ users2 = Table('u2', metadata,
+ Column('user_id', INT, primary_key = True),
+ Column('user_name', VARCHAR(20)),
+ )
metadata.create_all()
def tearDown(self):
addresses.delete().execute()
users.delete().execute()
+ users2.delete().execute()
def tearDownAll(self):
metadata.drop_all()
@@ -448,7 +454,24 @@ class QueryTest(TestBase):
self.assert_(r['query_users.user_id']) == 1
self.assert_(r['query_users.user_name']) == "john"
-
+ def test_row_as_args(self):
+ users.insert().execute(user_id=1, user_name='john')
+ r = users.select(users.c.user_id==1).execute().fetchone()
+ users.delete().execute()
+ users.insert().execute(r)
+ assert users.select().execute().fetchall() == [(1, 'john')]
+
+ def test_result_as_args(self):
+ users.insert().execute([dict(user_id=1, user_name='john'), dict(user_id=2, user_name='ed')])
+ r = users.select().execute()
+ users2.insert().execute(list(r))
+ assert users2.select().execute().fetchall() == [(1, 'john'), (2, 'ed')]
+
+ users2.delete().execute()
+ r = users.select().execute()
+ users2.insert().execute(*list(r))
+ assert users2.select().execute().fetchall() == [(1, 'john'), (2, 'ed')]
+
def test_ambiguous_column(self):
users.insert().execute(user_id=1, user_name='john')
r = users.outerjoin(addresses).select().execute().fetchone()