Wouter van Marle
wouter at squirrel-systems.com
Tue May 23 10:50:48 EDT 2006
Joshua, Jim, Thanks for the replies - I think I understand it now. I completely overlooked the , vs % in the string replacement! When testing it on my debian box I copy-pasted the example in, while later I typed it in by hand. And then used the % which I didn't notice was "replaced" by a comma... That'll make a big difference. Wouter. On Tue, 2006-05-23 at 08:27 -0400, Joshua Ginsberg wrote: > This will work: > > c.execute('select foo from bar where baz = %s', (s,)) > > You are passing two arguments to execute() -- the first being a string > representing SQL and the second being a tuple of values to be > substituted in. The execute() method is smart enough to quote where > necessary. > > This will not work: > > c.execute('select foo from bar where baz = %s' % (s,)) > > You are passing a single argument to execute() -- a string that does > Python string formatting. The execute() method does not have a chance > to be smart enough to quote where necessary. > > In your "quick test on your system" you refer to below, you use the > first method. In your "I just tried again" you use the second method, > which is why it fails. > > -jag > > On May 23, 2006, at 2:22 AM, Wouter van Marle wrote: > > > On Tue, 2006-05-23 at 01:49 -0400, Joshua Ginsberg wrote: > >> Wouter -- > >> > >> You used % to do string substitution on the first argument to > >> execute() > >> as opposed to passing a tuple as a second argument to execute(). > > > > I don't get your meaning. > > Can you please give me the lines of code as example? Thanks! > > > > Wouter. > > > >> > >> -jag > >> > >> On May 22, 2006, at 11:50 PM, Wouter van Marle wrote: > >> > >>> On Tue, 2006-05-23 at 11:18 +0800, Wouter van Marle wrote: > >>>> On Wed, 2006-05-17 at 18:09 -0400, Jim Gallacher wrote: > >>>>>>> cur.execute("SELECT * FROM base WHERE field = %s", s) > >>>>>> > >>>>>> I have tried this (once) with MySQLdb, and it doesn't seem to work > >>>>> like > >>>>>> that. (v1.2.1g2) Didn't pursue the issue further. > >>>>> > >>>>> You must be doing something wrong. A quick test on my system: > >>>>> > >>>>>>>> s = """This is 'some' stuff with "quotes" and stuff""" > >>>>>>>> cursor.execute('insert into testtable (data) values (%s)', s) > >>>>> 1L > >>>> > >>>> Just tried it for myself - it works now. > >>> > >>> RRrrrriiiiigggghhhttt.... that said.... I just tried again... and now > >>> have a fail. Now I also remember why I didn't use that method yet :) > >>> > >>> - Debian Sarge, MySQLdb 1.2.1g2: works fine. > >>> - Mandriva Linux LE2005 (v10.2), MySQLdb 1.2.1g3: gives SQL error on > >>> this one. > >>> > >>>>>> cursor.execute("INSERT INTO testtable (field1) VALUES ('This is a > >>> string!');") > >>> 1L > >>>>>> cursor.execute("INSERT INTO testtable (field1) VALUES (%s);"% s) > >>> > >>> Traceback (most recent call last): > >>> File "<pyshell#15>", line 1, in -toplevel- > >>> cursor.execute("INSERT INTO testtable (field1) VALUES (%s);"% s) > >>> File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line > >>> 137, > >>> in execute > >>> self.errorhandler(self, exc, value) > >>> File "/usr/lib/python2.4/site-packages/MySQLdb/connections.py", > >>> line > >>> 33, in defaulterrorhandler > >>> raise errorclass, errorvalue > >>> 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 \'\'some\' stuff with "quotes" and stuff)\' at > >>> line > >>> 1') > >>> > >>> - Mandriva Linux 2006.0, MySQLdb 1.2.0final: works fine. > >>> > >>> So there is a serious bug in MySQLdb as well; seems to be the 1.2.1g3 > >>> version. > >>> > >>> Wouter. > >>> > >>>> Maybe I had an older version of MySQLdb when testing? I don't know > >>>> anymore. I'll follow your advice and fix my code! > >>>> > >>>> And after that the info in the databases... that's going to be a > >>>> harder > >>>> job. > >>>> > >>>> Wouter. > >>>> > >>>> > >>>> _______________________________________________ > >>>> Mod_python mailing list > >>>> Mod_python at modpython.org > >>>> http://mailman.modpython.org/mailman/listinfo/mod_python > >>>> > >>>> > >>> > >>> _______________________________________________ > >>> Mod_python mailing list > >>> Mod_python at modpython.org > >>> http://mailman.modpython.org/mailman/listinfo/mod_python > >> > >> > > > >
|