views:

88

answers:

3

I am trying to use the python 2.5 string formatting however I have run into problem in the following example:

values = {
          'url': 'http://blabla.com',
          'link' : 'http://blabla.com',
          'username' : 'user',
          'spot'    : 0,
          'views'    : 10,
          'date'    : 3232312,
          'private' : 1, 

          }

query = """insert into hyves.Image (URL, StaticLink , HostUsername, SpotCount, ViewCount, UploadDate) values ('%(url)','%(link)','%(username)',%(spot),%(views),%(date), %(private) )""" % values

print query

It gives me the following error:ValueError: unsupported format character ''' (0x27) at index 106. Can anyone help me?

+7  A: 

Never use string formatting for composing sql queries like that! Use your database module to do the interpolation -- it will do it with correct escaping, so that this doesn't happen to you: http://xkcd.com/327/

In case you want to use that formatting for different things than sql, use %(foo)s (or d, or whatever format you need).

Radomir Dopieralski
+1 for mentioning the dangers of formatting SQL queries like that
Jim Brissom
+1 for referencing xkcd
Ivo van der Wijk
Well the reason I am doing this is that the SQL files are outputed to files and are going to be executed manually by me. So I don't care about sanitizing the input.
n4cr
I think you should still care -- you are not going to validate it all by hand, and there always may be some stray `'` in the data.
Radomir Dopieralski
+2  A: 

You are missing the format characters, i.e.:

"INSERT INTO ... %(url)s, ..." % values

...if you want to format URL as a string.

Jim Brissom
+2  A: 

You need to specify explicit conversion flags:

query = """insert into hyves.Image (URL, StaticLink , HostUsername, SpotCount, ViewCount, UploadDate) values (%(url)s,%(link)s,%(username)s,%(spot)i,%(views)i,%(date)i, %(private)i )""" % values
Mark