Q
Andy Todd
andy47 at halfcooked.com
Sat Jul 31 14:38:24 EDT 2004
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
--
--------------------------------------------------------------------------------
From the desk of Andrew J Todd esq - http://www.halfcooked.com/
More information about the Python-list
mailing list