在Python MySQL的IN子句中嵌套一个列表
P粉781235689
P粉781235689 2023-08-22 17:04:59
0
2
526
<p>我知道如何将列表映射为字符串:</p> <pre class="brush:php;toolbar:false;">foostring = ",".join( map(str, list_of_ids) )</pre> <p>我知道我可以使用以下方法将该字符串放入IN子句中:</p> <pre class="brush:php;toolbar:false;">cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))</pre> <p>我需要以安全的方式(避免SQL注入)在MySQL数据库中实现相同的功能。在上面的示例中,因为foostring未作为参数传递给execute,它是有漏洞的。我还必须在MySQL库之外进行引用和转义。</p> <p>(有一个相关的SO问题,但那里列出的答案要么不适用于MySQL数据库,要么容易受到SQL注入攻击。)</p>
P粉781235689
P粉781235689

全部回复(2)
P粉434996845

虽然这个问题很旧,但我想留下回复,以防其他人也在寻找我想要的东西

当我们有很多参数或者想要使用命名参数时,接受的答案会变得混乱

经过一些尝试

ids = [5, 3, ...]  # id列表
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'
})

python2.7pymysql==0.7.11下测试通过

P粉212114661

直接使用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))

这样可以避免自己引用,也避免了各种SQL注入问题。

请注意,数据(list_of_ids)直接传递给mysql的驱动程序作为参数(而不是在查询文本中),因此没有注入问题。您可以在字符串中保留任何字符,无需删除或引用字符。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板