From: Mike Bayer Date: Sun, 28 Dec 2008 20:58:38 +0000 (+0000) Subject: - RowProxy objects can be used in place of dictionary arguments X-Git-Tag: rel_0_5_0~58 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7009653aa1c53d1f761501522d55617d3fdcc57c;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - RowProxy objects can be used in place of dictionary arguments sent to connection.execute() and friends. [ticket:935] --- diff --git a/CHANGES b/CHANGES index fd3dfd0fa3..4f2f07f679 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 7af74ec7bb..24fd1cc6e5 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 acfe4a4b09..e62dfa076c 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()