我正在使用带有python的mysql-connector并且有这样的查询:
SELECT avg(downloadtime) FROM tb_npp where date(date) between %s and %s and host like %s",(s_date,e_date,"%" + dc + "%")
否则,如果我的变量'dc'是这样的列表:
dc = ['sjc','iad','las']
然后我有一个如下所示的mysql查询:
SELECT avg(downloadtime) FROM tb_npp where date(date) = '2013-07-01' and substring(host,6,3) in ('sjc','las');
我的问题是,如何在我的python代码中编写此查询,将我的变量'dc'转换为列表?
我尝试了以下查询,但收到错误:处理格式参数失败; 'MySQLConverter'对象没有属性'_list_to_mysql'
cursor3.execute("SELECT avg(downloadtime) FROM tb_npp where date(date) between %s and %s and substring(host,6,3) in %s",(s_date,e_date,dc))
有人可以告诉我我做错了吗?
提前致谢
答案 0 :(得分:8)
我不熟悉mysql-connector,但在这方面它的行为似乎是similar to MySQLdb。如果这是真的,你需要使用一些字符串格式:
sql = """SELECT avg(downloadtime) FROM tb_npp where date(date) = %s
and substring(host,6,3) in ({c})""".format(
c=', '.join(['%s']*len(dc)))
args = ['2013-07-01'] + dc
cursor3.execute(sql, args)
答案 1 :(得分:0)
作为@unutbu 特定于使用 mysql-connector 的答案的替代方法:
cursor.execute(
"SELECT thing "
" FROM table "
" WHERE some_col > %(example_param)s "
" AND id IN ({li})".format(li=", ".join(list_of_values)),
params={
"example_param": 33
})
如果您尝试将加入的列表移动到一个参数(如示例参数)中,它可能 抱怨是因为 mysql-connector 将值解释为字符串。
如果默认情况下您的列表不是由可字符串格式的内容(如整数)组成,则在您的连接语句中将 list_of_values
替换为:
[str(v) for v in list_of_values]