2 votes

Python encodage de chaîne déroutant

J'ai la liste suivante de fournisseurs (en russe) :

providers = [u'\u041e\u041e\u041e "\u041a\u0432\u0430\u0440\u0442\u0430\u043b 
            \u041b\u0435\u043e\u043f\u043e\u043b\u0438\u0441"', 
            u'\u0426\u0435\u043d\u0442\u0440\u0430\u043b']

Il s'agit clairement d'unicode. Auparavant, pour faire une requête SQL SELECT, j'utilisais :

providers = tuple([str(item) for item in providers])
sql += " WHERE provider IN {} GROUP BY date ORDER BY date ASC".format(repr(providers))
cursor.execute(sql,)

Maintenant, comme les éléments de la liste sont en unicode, je rencontre une UnicodeEncodeError.

Comment pourrais-je correctement effectuer cette instruction SQL ?

4voto

Martijn Pieters Points 271458

Vous ne devriez pas utiliser .format() pour inclure des valeurs dans une requête sql. Utilisez plutôt des paramètres sql :

sql += " WHERE provider IN ({}) GROUP BY date ORDER BY date ASC".format(', '.join(['%s'] * len(providers)))

cursor.execute(sql, providers)

providers est la liste d'origine.

L'idée est de générer une requête SQL avec le test in en utilisant la syntaxe des paramètres SQL correspondant au nombre de fournisseurs dans votre liste : WHERE provider in (%s, %s) ... pour une liste de deux fournisseurs. Oui, la syntaxe des paramètres sql de MySQLdb reflète la syntaxe de formatage de l'ancienne manière de Python, mais ce n'est pas la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X