6

我正在使用 mysql-connector 和 python 并有这样的查询:

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))

有人可以告诉我我做错了什么吗?

提前致谢

4

2 回答 2

12

我不熟悉 mysql-connector,但在这方面它的行为似乎类似于 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)
于 2013-07-25T01:16:39.730 回答
2

作为@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]   
于 2021-02-11T23:52:01.617 回答