Oleg Broytmann wrote:
Is there a mechanism by which I can ask SQLObject to add these parens?

   SQLObject generates query strings in dbconnection.py and sqlbuilder.py
modules. I think the only way to fix this would be to always add parens
whatever parameters are, Select() or not.

Thank you -- this turned out to be an entirely trivial patch. It would be nice if someone with all the database engines available could run the test suite; I'm presently only using SQLite (and don't know offhand how to invoke the test suite against only one backend anyhow, should such be supported).

Thanks!
Index: sqlobject/dbconnection.py
===================================================================
--- sqlobject/dbconnection.py	(revision 1695)
+++ sqlobject/dbconnection.py	(working copy)
@@ -560,9 +560,9 @@
     # in the SQLObject class.
 
     def _SO_update(self, so, values):
-        self.query("UPDATE %s SET %s WHERE %s = %s" %
+        self.query("UPDATE %s SET %s WHERE %s = (%s)" %
                    (so.sqlmeta.table,
-                    ", ".join(["%s = %s" % (dbName, self.sqlrepr(value))
+                    ", ".join(["%s = (%s)" % (dbName, self.sqlrepr(value))
                                for dbName, value in values]),
                     so.sqlmeta.idName,
                     self.sqlrepr(so.id)))
@@ -571,40 +571,40 @@
         columns = ", ".join(columnNames)
         if columns:
             return self.queryOne(
-                "SELECT %s FROM %s WHERE %s = %s" %
+                "SELECT %s FROM %s WHERE %s = (%s)" %
                 (columns,
                  so.sqlmeta.table,
                  so.sqlmeta.idName,
                  self.sqlrepr(so.id)))
         else:
             return self.queryOne(
-                "SELECT NULL FROM %s WHERE %s = %s" %
+                "SELECT NULL FROM %s WHERE %s = (%s)" %
                 (so.sqlmeta.table,
                  so.sqlmeta.idName,
                  self.sqlrepr(so.id)))
 
     def _SO_selectOneAlt(self, cls, columnNames, column, value):
-        return self.queryOne("SELECT %s FROM %s WHERE %s = %s" %
+        return self.queryOne("SELECT %s FROM %s WHERE %s = (%s)" %
                              (", ".join(columnNames),
                               cls.sqlmeta.table,
                               column,
                               self.sqlrepr(value)))
 
     def _SO_delete(self, so):
-        self.query("DELETE FROM %s WHERE %s = %s" %
+        self.query("DELETE FROM %s WHERE %s = (%s)" %
                    (so.sqlmeta.table,
                     so.sqlmeta.idName,
                     self.sqlrepr(so.id)))
 
     def _SO_selectJoin(self, soClass, column, value):
-        return self.queryAll("SELECT %s FROM %s WHERE %s = %s" %
+        return self.queryAll("SELECT %s FROM %s WHERE %s = (%s)" %
                              (soClass.sqlmeta.idName,
                               soClass.sqlmeta.table,
                               column,
                               self.sqlrepr(value)))
 
     def _SO_intermediateJoin(self, table, getColumn, joinColumn, value):
-        return self.queryAll("SELECT %s FROM %s WHERE %s = %s" %
+        return self.queryAll("SELECT %s FROM %s WHERE %s = (%s)" %
                              (getColumn,
                               table,
                               joinColumn,
@@ -612,7 +612,7 @@
 
     def _SO_intermediateDelete(self, table, firstColumn, firstValue,
                                secondColumn, secondValue):
-        self.query("DELETE FROM %s WHERE %s = %s AND %s = %s" %
+        self.query("DELETE FROM %s WHERE %s = (%s) AND %s = (%s)" %
                    (table,
                     firstColumn,
                     self.sqlrepr(firstValue),
Index: sqlobject/dbconnection.py
===================================================================
--- sqlobject/dbconnection.py	(revision 1695)
+++ sqlobject/dbconnection.py	(working copy)
@@ -604,9 +604,9 @@
     # in the SQLObject class.
 
     def _SO_update(self, so, values):
-        self.query("UPDATE %s SET %s WHERE %s = %s" %
+        self.query("UPDATE %s SET %s WHERE %s = (%s)" %
                    (so.sqlmeta.table,
-                    ", ".join(["%s = %s" % (dbName, self.sqlrepr(value))
+                    ", ".join(["%s = (%s)" % (dbName, self.sqlrepr(value))
                                for dbName, value in values]),
                     so.sqlmeta.idName,
                     self.sqlrepr(so.id)))
@@ -615,14 +615,14 @@
         columns = ", ".join(columnNames)
         if columns:
             return self.queryOne(
-                "SELECT %s FROM %s WHERE %s = %s" %
+                "SELECT %s FROM %s WHERE %s = (%s)" %
                 (columns,
                  so.sqlmeta.table,
                  so.sqlmeta.idName,
                  self.sqlrepr(so.id)))
         else:
             return self.queryOne(
-                "SELECT NULL FROM %s WHERE %s = %s" %
+                "SELECT NULL FROM %s WHERE %s = (%s)" %
                 (so.sqlmeta.table,
                  so.sqlmeta.idName,
                  self.sqlrepr(so.id)))
@@ -635,7 +635,7 @@
             raise ValueError, "'column' and 'value' tuples must be of the same size"
         columns = []
         for i in xrange(len(column)):
-            columns.append("%s = %s" % (column[i], self.sqlrepr(value[i])))
+            columns.append("%s = (%s)" % (column[i], self.sqlrepr(value[i])))
         condition = ' AND '.join(columns)
         return self.queryOne("SELECT %s FROM %s WHERE %s" %
                              (", ".join(columnNames),
@@ -643,20 +643,20 @@
                               condition))
 
     def _SO_delete(self, so):
-        self.query("DELETE FROM %s WHERE %s = %s" %
+        self.query("DELETE FROM %s WHERE %s = (%s)" %
                    (so.sqlmeta.table,
                     so.sqlmeta.idName,
                     self.sqlrepr(so.id)))
 
     def _SO_selectJoin(self, soClass, column, value):
-        return self.queryAll("SELECT %s FROM %s WHERE %s = %s" %
+        return self.queryAll("SELECT %s FROM %s WHERE %s = (%s)" %
                              (soClass.sqlmeta.idName,
                               soClass.sqlmeta.table,
                               column,
                               self.sqlrepr(value)))
 
     def _SO_intermediateJoin(self, table, getColumn, joinColumn, value):
-        return self.queryAll("SELECT %s FROM %s WHERE %s = %s" %
+        return self.queryAll("SELECT %s FROM %s WHERE %s = (%s)" %
                              (getColumn,
                               table,
                               joinColumn,
@@ -664,7 +664,7 @@
 
     def _SO_intermediateDelete(self, table, firstColumn, firstValue,
                                secondColumn, secondValue):
-        self.query("DELETE FROM %s WHERE %s = %s AND %s = %s" %
+        self.query("DELETE FROM %s WHERE %s = (%s) AND %s = (%s)" %
                    (table,
                     firstColumn,
                     self.sqlrepr(firstValue),
Index: sqlobject/main.py
===================================================================
--- sqlobject/main.py	(revision 1695)
+++ sqlobject/main.py	(working copy)
@@ -1293,7 +1293,7 @@
             else:
                 names = []
                 for i in xrange(len(name)):
-                    names.append("%s = %s" % (name[i], repr(value[i])))
+                    names.append("%s = (%s)" % (name[i], repr(value[i])))
                 names = ', '.join(names)
                 raise SQLObjectNotFound, "The %s by unique index %s(%s) does not exist" % (cls.__name__, idxName, names)
         if obj:
@@ -1483,7 +1483,7 @@
                 if col.cascade == False:
                     # Found a restriction
                     restrict = True
-                query.append("%s = %s" % (col.dbName, self.id))
+                query.append("%s = (%s)" % (col.dbName, self.id))
                 if col.cascade == 'null':
                     setnull = col.name
                 elif col.cascade:

Reply via email to