2010-09-13 6 views
0

Je suis en train d'utiliser la mise en forme de chaîne de Python 2.5 mais j'ai rencontré problème dans l'exemple suivant:Python 2.5 Problème de formatage de chaîne!

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 

Il me donne l'erreur suivante: ValueError: caractère de format non pris en charge « » »(0x27) à l'index 106. Quelqu'un peut-il m'aider?

+0

La [documentation Sqlite3] (http://docs.python.org/library/sqlite3.html) donne un exemple de la façon de faire la substitution de paramètres pour SQL requêtes. –

Répondre

9

N'utilisez jamais la mise en forme de chaîne pour composer des requêtes sql comme ça! Utilisez votre module de base de données pour faire l'interpolation - il le fera avec l'échappement correct, de sorte que cela ne vous arrive pas: http://xkcd.com/327/

Si vous voulez utiliser cette mise en forme pour des choses différentes de SQL, utilisez %(foo)s (ou d, ou quel que soit le format dont vous avez besoin).

+0

+1 pour mentionner les dangers de formater des requêtes SQL comme ça –

+0

+1 pour référencer xkcd –

+0

Eh bien la raison pour laquelle je fais cela est que les fichiers SQL sont édités dans des fichiers et vont être exécutés manuellement par moi. Donc, je ne me soucie pas de l'assainissement de l'entrée. – Nasir

3

Il vous manque les caractères de format, i.e. .:

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

... si vous voulez formater l'URL comme une chaîne.

3

Vous devez spécifier explicit conversion drapeaux:

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