[Tutor] Re: Q

John Fabiani jfabiani at yolo.com
Sat Jul 31 22:46:48 CEST 2004


Andy Todd wrote:

> John Fabiani wrote:
>> thanks that worked but I don't understand why.
>> cursor.execute("SELECT * FROM mytest where address = %s",string1)
>> above works but  - following your suggestion:
>> cursor.execute("SELECT * FROM mytest where address = %s" % string1)
>> above does not work.  So why did
>>  cursor.execute("SELECT * FROM mytest where clientID = %d" % numb)
>> work???????????????
>> john
>> F. GEIGER wrote:
>> 
>> 
>>>"John Fabiani" <jfabiani at yolo.com> schrieb im Newsbeitrag
>>>news:lGIOc.4961$AY5.4762 at newssvr21.news.prodigy.com...
>>>
>>>>Hi,
>>>> I'm a newbie and I'm attempting to learn howto create a select
>>>> statement.
>>>>When I use
>>>>
>>>>>>>string1='18 Tadlock Place'
>>>>>>>cursor.execute("SELECT * FROM member")
>>>>
>>>>All works as expected.  But
>>>>
>>>>>>>numb=10
>>>>>>>cursor.execute("SELECT * FROM mytest where clientID = %d",numb)
>>>
>>>I'm used to do that this way:
>>>
>>>cursor.execute("SELECT * FROM mytest where clientID = %d" % numb)
>>>
>>>HTH
>>>Franz GEIGER
>>>
>>>
>>>>Traceback (innermost last):
>>>>  File "<stdin>", line 1, in ?
>>>>  File "/usr/lib64/python2.3/site-packages/MySQLdb/cursors.py", line 95,
>>>
>>>in
>>>
>>>>execute
>>>>    return self._execute(query, args)
>>>>  File "/usr/lib64/python2.3/site-packages/MySQLdb/cursors.py", line
>>>>  110,
>>>
>>>in
>>>
>>>>_execute
>>>>    self.errorhandler(self, TypeError, m)
>>>>  File "/usr/lib64/python2.3/site-packages/MySQLdb/connections.py", line
>>>
>>>33,
>>>
>>>>in defaulterrorhandler
>>>>    raise errorclass, errorvalue
>>>>TypeError: int argument required
>>>>
>>>>ClientID was created using "clientID int not null auto_increment primary
>>>>key"
>>>>
>>>>
>>>>What is the correct way passing the numb var to the string?
>>>>Thanks John
>> 
>> 
> 
> It's not too intuitive, but when using the 'format' parameter style in
> DB-API modules[1] (as used here) you *always* use '%s' to indicate that
> a substitution should take place.
> 
> The solution that F GEIGER proposed uses string formatting and will not
> take advantage of parameter binding properly. So instead of
> 
>  >>> cursor.execute("SELECT * FROM mytest where clientID = %d" % numb)
> 
> You should use
> 
>  >>> cursor.execute("SELECT * FROM mytest where clientID = %s", numb)
> 
> The first version 'works' because the string is parsed before it is
> passed to the MySQLdb module, so if numb is 10 it's the exact same as;
> 
>  >>> cursor.execute("SELECT * FROM mytest where clientID = 10")
> 
> The second (and correct) suggestion uses parameter binding, so if you
> execute the statement a number of times (with different values of
> 'numb') the database has to do less work - and therefore your code will
> run faster. This is important but probably outside the scope of this
> discussion.
> 
> [1] http://www.python.org/peps/pep-0249.html
> 
> Regards,
> Andy
Thanks very much - I think a little light was just turned on.  It makes sense 
that the number (numb in this case) be converted to a string - since I'm 
passing a string to the DB module (I want to call it a driver/interface).  I 
was writing up this long note to myself trying to explain the way to pass 
number and strings.  But now I realize how simple the issue really was.

Well I'm learning daily.  
john


More information about the Tutor mailing list