我有以下提供者列表(俄语):
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']
这些显然是unicode。以前,要做SQL SELECT,我正在做:
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,)
现在,由于列表项是unicode,我遇到了UnicodeEncodeError
。
我如何正确地执行此sql语句?
答案 0 :(得分:4)
您不应该使用.format()
在sql查询中包含值。改为使用sql参数:
sql += " WHERE provider IN ({}) GROUP BY date ORDER BY date ASC".format(', '.join(['%s'] * len(providers)))
cursor.execute(sql, providers)
其中providers
是原始列表。
我们的想法是使用in
测试生成一个SQL查询,使用的SQL参数语法与列表中的提供程序数量相匹配:WHERE provider in (%s, %s) ...
表示双提供程序列表。是的,MySQLdb sql参数语法与旧式python格式化语法相呼应,但不是一回事。