2010-10-13 5 views
0

Je RECEVOIR erreurs comme celui-ci:comment formater les variables avant db pour éviter les erreurs

_mysql_exceptions.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 't Stop.mp3' LIMIT 1' at line 1")

Parce que je suis en train de comparer une URL qui existe dans mon DB à un dans une variable avant que je choisis pour l'insérer ou non avec le code ci-dessous:

`#see if any links in the DB match the crawled link 

check_exists_sql = "SELECT * FROM LINKS WHERE link = '%s' LIMIT 1" % item['link'].encode("utf-8") 

cursor.execute(check_exists_sql)` 

il est évident que le caractère ' et peut-être d'autres personnages sont à l'origine des problèmes.

Comment formater ces URL pour éviter cela?

+0

Connaissez-vous un gars appelé [Tables Bobby] (http://xkcd.com/327/)? – AndiDog

Répondre

3

Soit le module MySQLdb faire l'interpolation:

cursor.execute("""SELECT * FROM LINKS WHERE link = %s LIMIT 1""", 
    (item['link'].encode("utf-8"),) 
) 

La fonction execute() peut passer les articles à être substitué dans la requête (voir the documentation for execute()). Il va automatiquement échapper aux choses nécessaires pour la requête DB.

Si vous préférez utiliser un dict au lieu d'un tuple de préciser les choses à remplacer dans:

cursor.execute("""SELECT * FROM LINKS WHERE link = %(link)s LIMIT 1""", 
    {'link': item['link'].encode("utf-8")} 
) 
+0

Annuler que ... juste des erreurs dans ma version où la chaîne sql est séparée de la 'execute' – ian

+0

Par souci d'exhaustivité, il faut noter que les caractères de remplacement ('% s', '?', '% (withdictionary) s') varie selon les modules DB car [PEP 249] (http://www.python.org/dev/peps/pep-0249/) autorise différents styles de paramètres. – AndiDog

Questions connexes