]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- RowProxy objects can be used in place of dictionary arguments
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 28 Dec 2008 20:58:38 +0000 (20:58 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 28 Dec 2008 20:58:38 +0000 (20:58 +0000)
sent to connection.execute() and friends.  [ticket:935]

CHANGES
lib/sqlalchemy/engine/base.py
test/sql/query.py

diff --git a/CHANGES b/CHANGES
index fd3dfd0fa31a5cadfcdf83a0a230f341d42783db..4f2f07f679409dddb3ad0e90021447af33978d4a 100644 (file)
--- 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.
index 7af74ec7bbb436f015469e41a9a3ad5111b20243..24fd1cc6e551e7d6d691646db18dc8bc425912e1 100644 (file)
@@ -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]
index acfe4a4b0992679ee09698650989aadcbc3521c5..e62dfa076c9f0b00985fb4bf53a7d308b16a826d 100644 (file)
@@ -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()