help with mysql cursor.execute()

Steve Holden steve at holdenweb.com
Mon Aug 15 07:35:13 EDT 2005


William Gill wrote:
> I have been testing and it seems that:
> 
> 1- Cursor.execute does not like '?' as a placeholder in sql
> 
The particular format required by each DBI-compatible module should be 
available as the module's "paramstyle" variable. mxODBC, for example, 
uses the "qmark" style, but MySQLdb uses "format".

> 2- Cursor.execute accepts '%s' but puts the quotation mark around the 
> substitution.
> 
>    sql = 'select * from %s where cusid = ? ' % name
>    Cursor.execute(sql, (recID,))
> 
> still fails, but:
> 
>    sql = 'select * from basedata where cusid = %s '
>    Cursor.execute(sql, (recID,))
> 
> works regardless of recID being a string or an int.  Obviously this 
> stems from trying to parameterize the table name.
> 
That's correct, as Scott has pointed out (with a good explanation of why).

> If I use:
> 
>    sql = 'select * from %s where cusid = %%s ' % name
>    Cursor.execute(sql, (recID,))
> 
> It makes 1 substitution in the first line, and another in the execute()
> 
>    sql = 'select * from %s where cusid = %%s ' % name
>    # sql now == 'select * from basedata where cusid = %s '
>    Cursor.execute(sql, (recID,))
> 
> and it works.
> 
That's right: you are now building a table-dependent query (i.e. the 
table name is hard-wired in the SQL string) parameterized to the 
required value for cusid.

> Between your comments re: column names and table names , and the notes 
> in cursor.py, I was able to figure it out.
> 
> FYI I wanted to create a tableHandler class that could be extended for 
> individual tables.  That's why the query needs to accept variables for 
> tablename.

You might want to take a look at how some existing object-mappers 
achieve this - Ian Bicking's sqlobject module might be a good place to 
start.

regards
  Steve

> 
> Thanks.
> 
> Bill
> 
> Scott David Daniels wrote:
> 
>>William Gill wrote:
>>
>>
>>>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))
>>>or
>>>  sql= 'select * from ? where cusid like ? '
>>>  Cursor.execute(sql,(name,recID))
>>>it fails.
>>>Can someone help me with the semantics of using parameterized queries?
>>
>>
>>Neither column names nor table names can be parameters to
>>fixed SQL.  Values are what you fiddle with.  This squares with
>>the DBMS being allowed to plan the query before looking at the
>>parameters (deciding which indices to use, which tables to join
>>first, ...), then reusing the plan for identical queries with
>>different values.  MySQL may not take advantage of this two-step
>>approach, but the DB interface is designed to allow it, so
>>the parameterization is constrained.
>>
>>See if something like this works:
>>
>>    sql = 'select * from %s where cusid like ? ' % name
>>    Cursor.execute(sql, (recID,))
>>
>>--Scott David Daniels
>>Scott.Daniels at Acm.Org


-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC             http://www.holdenweb.com/




More information about the Python-list mailing list