help with mysql cursor.execute()

William Gill noreply at gcgroup.net
Tue Aug 16 12:03:48 EDT 2005


Dennis Lee Bieber wrote:
> On Sun, 14 Aug 2005 19:28:04 GMT, William Gill <noreply at gcgroup.net>
> declaimed the following in comp.lang.python:
> 
> 
>>I have been trying to pass parameters as indicated in the api.
>>when I use:
>>
>>   sql= 'select * from %s where cusid = %s ' % name,recID)
>>   Cursor.execute(sql)
>>
>>it works fine, but when I try :
>>
>>   sql= 'select * from %s where cusid like %s '
>>   Cursor.execute(sql,(name,recID))
>>
> 
> 	Hypothesis: the database TABLE may need to be filled in externally.
> .execute() parsing is designed to properly quote arguments for data
> fields where needed.
> 
> 	I suspect you are getting quote marks around the table name, which
> is not a position they are expected.
> 

 From my testing, your suspicion is correct, as is your suggestion.

   sql = 'select * from %s where cusid = %%s ' % tablename
   Cursor.execute(sql, (recID,))

works,

Bill
> 	You'll likely have to use a two-step process: use string formatting
> to fill in table and field names (if you are getting those from user
> input, you'll have to validate that there isn't an injection attack --
> ie, user didn't enter "name; delete from name" as the table to be
> processed); then use .execute() to pass the field values.
> 
> 	If using MySQLdb, you could always read the source files... (Though,
> unfortunately, the very bottom is a compiled library and hence
> unreadable...
> 
> 
> 	You'll find .execute() invokes an .escape()
> 
> Py>     escape(...)
> Py>         escape(obj, dict) -- escape any special characters in object
> obj
> Py>         using mapping dict to provide quoting functions for each
> type.
> Py>         Returns a SQL literal string.
> 
> 	Note the last line: it returns a "literal string" -- in the form
> needed to pass /data/. That won't work for field and table names, and
> MySQLdb doesn't attempt any semantic parsing to find out is being
> substituted -- if just converts (escapes) ALL parameters based on
> datatype, THEN does a normal Python string formatting operation.



More information about the Python-list mailing list