[Tutor] mysql formatting

Marilyn Davis marilyn at deliberate.com
Wed Nov 3 20:30:37 CET 2004


Darn me.

I still don't have it right.

As a reminder, here's my method:

     def execute_mysql(self, this, *args):
         if log.level & log.sql:
             log.it('About to execute:' + this + '<-->' + repr(args))
         try:
             self.cursor.execute(this, args)
         except _mysql_exceptions.Warning, msg:
             log.it('Mysql Warning: ' + str(msg))
         except _mysql_exceptions.OperationalError, msg:
             print "Are you using the right data base?  Try changing 
/b/local/doorman/configure.py TESTING = 0"
             raise


Yes, Danny is right that the database name must be hard-coded:


     s = 'update doorman set status = "%s" where in_id = %s and out_address like 
"%%%s%%"'
     my_connection.execute_mysql(s, new_status, inside_id, out_address)


Doing that eliminates the traceback.  But the update doesn't happen
and in mysql's log I see:

update doorman set status = "'MOVED'" where in_id = '60' and
out_address like "%'courier-imap-admin at lists.sourceforge.net'%";

So I still have too many 's.

Here I try Lloyd's idea and take all the quotes out of my format:

     s = 'update doorman set status = %s where in_id = %d and out_address like 
%%%s%%'
     my_connection.execute_mysql(s, new_status, int(inside_id), out_address)


inside_id is "60", as a string.  I figured I have better luck passing
int(inside_id). But:

   File "/usr/lib/python2.3/site-packages/MySQLdb/connections.py", line 33, in 
defaulterrorhandler
     raise errorclass, errorvalue
TypeError: int argument required

That sure stumps me.

So I try %s:

     s = 'update doorman set status = %s where in_id = %s and out_address like 
%%%s%%'
     my_connection.execute_mysql(s, new_status, inside_id, out_address)

Gets me:

_mysql_exceptions.ProgrammingError: (1064, "You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near
'%'courier-imap-admin at lists.sourceforge.net'%' at line 1")

Maybe it has something to do with unpacking the tuple?  So I give a
fancy version a try, back to fiddling with escapes:

     def execute_mysql(self, this, *args):
         caller = 'self.cursor.execute(\"%s\"' % this
         for each in args:
             caller += ", " + each
         caller += ')'
         print caller
         try:
             exec(caller)
#            self.cursor.execute(this, args)
         except _mysql_exceptions.Warning, msg:
             log.it('Mysql Warning: ' + str(msg))
         except _mysql_exceptions.OperationalError, msg:
             print "Are you using the right data base?  Try changing 
/b/local/doorman/configure.py TESTING = 0"
             raise

and I go back to this call, afterall, it has "%s", %s, and "%%%s%%",
trying everything:

     s = 'update doorman set status = "%s" where in_id = %s and out_address like 
"%%%s%%"'
     my_connection.execute_mysql(s, new_status, inside_id, out_address)


     self.cursor.execute("update doorman set status = "%s" where in_id = %s and 
out_address like "%%%s%%"", MOVED, 60, courier-imap-admin at lists.sourceforge.net)
                                                                                                 ^
SyntaxError: invalid syntax


I don't know.  This is very hard!

Maybe I should use MySQLdb.escape_string on my addresses and be happy
with that?  Maybe this is why it's not documented, maybe it's not so
robust.

Thank you for your help and thought.

Marilyn





-- 



More information about the Tutor mailing list