]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
oracle is requiring dictionary params to be in a clean dict, added conversion
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 13 Mar 2006 02:00:21 +0000 (02:00 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 13 Mar 2006 02:00:21 +0000 (02:00 +0000)
some fixes to unit tests

lib/sqlalchemy/engine.py
lib/sqlalchemy/exceptions.py
lib/sqlalchemy/sql.py
test/objectstore.py
test/testtypes.py

index e44e0a9509c0945bd84b43b386f48bba6f9b4616..8a29b847fc7a5ec469f0f84012a19005a46feb96 100644 (file)
@@ -586,14 +586,7 @@ class SQLEngine(schema.SchemaEngine):
             if statement is None:
                 return cursor
             
-            executemany = parameters is not None and isinstance(parameters, list)
-
-            if self.positional:
-                if executemany:
-                    parameters = [p.values() for p in parameters]
-                else:
-                    parameters = parameters.values()
-
+            parameters = self._convert_compiled_params(parameters)
             self.execute(statement, parameters, connection=connection, cursor=cursor, return_raw=True)        
             return cursor
 
@@ -657,12 +650,12 @@ class SQLEngine(schema.SchemaEngine):
             return ResultProxy(cursor, self, typemap=typemap)
 
     def _execute(self, c, statement, parameters):
+        if parameters is None:
+            if self.positional:
+                parameters = ()
+            else:
+                parameters = {}
         try:
-            if parameters is None:
-                if self.positional:
-                    parameters = ()
-                else:
-                    parameters = {}
             c.execute(statement, parameters)
         except Exception, e:
             raise exceptions.SQLError(statement, parameters, e)
@@ -671,15 +664,26 @@ class SQLEngine(schema.SchemaEngine):
         c.executemany(statement, parameters)
         self.context.rowcount = c.rowcount
 
-    def proxy(self, statement=None, parameters=None):
+    def _convert_compiled_params(self, parameters):
         executemany = parameters is not None and isinstance(parameters, list)
+        # the bind params are a CompiledParams object.  but all the DBAPI's hate
+        # that object (or similar).  so convert it to a clean 
+        # dictionary/list/tuple of dictionary/tuple of list
+        if parameters is not None:
+           if self.positional:
+                if executemany:
+                    parameters = [p.values() for p in parameters]
+                else:
+                    parameters = parameters.values()
+           else:
+                if executemany:
+                    parameters = [p.get_raw_dict() for p in parameters]
+                else:
+                    parameters = parameters.get_raw_dict()
+        return parameters
 
-        if self.positional:
-            if executemany:
-                parameters = [p.values() for p in parameters]
-            else:
-                parameters = parameters.values()
-
+    def proxy(self, statement=None, parameters=None):
+        parameters = self._convert_compiled_params(parameters)
         return self.execute(statement, parameters)
     
     def log(self, msg):
index 6883293ec5715a8e48966659918e97f09d0de34a..e270225d8f74e0972552870942c2a1803de86f64 100644 (file)
@@ -17,6 +17,8 @@ class SQLError(SQLAlchemyError):
         self.statement = statement
         self.params = params
         self.orig = orig
+    def __str__(self):
+        return SQLAlchemyError.__str__(self) + " " + repr(self.statement) + " " + repr(self.params)
 
 class ArgumentError(SQLAlchemyError):
     """raised for all those conditions where invalid arguments are sent to constructed
@@ -38,4 +40,4 @@ class AssertionError(SQLAlchemyError):
     
 class DBAPIError(SQLAlchemyError):
     """something weird happened with a particular DBAPI version"""
-    pass
\ No newline at end of file
+    pass
index a6fe3e8800aa6a6572489fe33b87eb4ab2cb5097..7ed013dfcf2cf8a492cd942d9a8e73033d7590a2 100644 (file)
@@ -252,6 +252,11 @@ class ClauseParameters(util.OrderedDict):
         return [self[key] for key in self]
     def get_original_dict(self):
         return self.copy()
+    def get_raw_dict(self):
+        d = {}
+        for k in self:
+            d[k] = self[k]
+        return d
         
 class ClauseVisitor(object):
     """Defines the visiting of ClauseElements."""
index 0a02d6fb113c7f9529554fbfb2c9f76ca9338641..312e1b53f12c31a30316e7fcfb2e124acb4127e8 100644 (file)
@@ -144,7 +144,7 @@ class SessionTest(AssertMixin):
 class UnicodeTest(AssertMixin):
     def setUpAll(self):
         global uni_table
-        uni_table = Table('test', db,
+        uni_table = Table('uni_test', db,
             Column('id',  Integer, primary_key=True),
             Column('txt', Unicode(50))).create()
 
index d44c439bdb90b96098aad1873e60da5b64e4e050..b874fe0afef02ed812b7a114921c8cd2429b24d9 100644 (file)
@@ -96,7 +96,7 @@ class UnicodeTest(AssertMixin):
     def setUpAll(self):
         global unicode_table
         unicode_table = Table('unicode_table', db, 
-            Column('id', Integer, primary_key=True),
+            Column('id', Integer, Sequence('uni_id_seq', optional=True), primary_key=True),
             Column('unicode_data', Unicode(250)),
             Column('plain_data', String(250))
             )