我知道如何将列表映射到字符串:
foostring = ",".join( map(str, list_of_ids) )
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下内容将该字符串转换为IN子句:
cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))
Run Code Online (Sandbox Code Playgroud)
我需要的是使用MySQLDB安全地完成同样的事情(避免SQL注入).在上面的示例中,因为foostring不作为参数传递来执行,所以它很容易受到攻击.我还必须在mysql库之外引用并转义.
(有一个相关的SO问题,但那里列出的答案要么对MySQLDB不起作用,要么易受SQL注入攻击.)
我正在使用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 + "%")
Run Code Online (Sandbox Code Playgroud)
不,如果我的变量'dc'是这样的列表:
dc = ['sjc','iad','las']
Run Code Online (Sandbox Code Playgroud)
然后我有一个像下面这样的mysql查询:
SELECT avg(downloadtime) FROM tb_npp where date(date) = '2013-07-01' and substring(host,6,3) in ('sjc','las');
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何在我的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))
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我我做错了什么吗?
提前致谢
我需要在python中将一批参数传递给mysql。这是我的代码:
sql = """ SELECT * from my_table WHERE name IN (%s) AND id=%(Id)s AND puid=%(Puid)s"""
params = {'Id':id,'Puid' : pid}
in_p=', '.join(list(map(lambda x: '%s', names)))
sql = sql %in_p
cursor.execute(sql, names) #todo: add params to sql clause
Run Code Online (Sandbox Code Playgroud)
问题是我想将名称列表传递给 sql IN 子句,同时我还想将 id 和 puid 作为参数传递给 sql 查询子句。我如何在 python 中实现这些?