我知道如何将列表映射到字符串:
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注入攻击.)
nos*_*klo 137
list_of_ids直接使用:
format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
tuple(list_of_ids))
Run Code Online (Sandbox Code Playgroud)
这样你就可以避免引用自己,并避免各种sql注入.
请注意,data(list_of_ids)直接作为参数(不在查询文本中)直接转到mysql的驱动程序,因此没有注入.你可以在字符串中留下你想要的任何字符,不需要删除或引用字符.
mar*_*rkk 11
虽然这个问题已经很老了,但我认为最好留下回复以防其他人正在寻找我想要的东西
当我们有很多参数或者我们想使用命名参数时,接受的答案会变得混乱
经过一些试验
ids = [5, 3, ...] # list of ids
cursor.execute('''
SELECT
...
WHERE
id IN %(ids)s
AND created_at > %(start_dt)s
''', {
'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
})
Run Code Online (Sandbox Code Playgroud)
测试python2.7,pymysql==0.7.11
| 归档时间: |
|
| 查看次数: |
33484 次 |
| 最近记录: |