我知道如何将列表映射到字符串:
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注入攻击.)
我在Python中执行某些SQL时遇到问题,尽管类似的SQL在mysql命令行中工作正常.
该表如下所示:
mysql> SELECT * FROM foo;
+-------+-----+
| fooid | bar |
+-------+-----+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
+-------+-----+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我可以从mysql命令行执行以下SQL查询,没有问题:
mysql> SELECT fooid FROM foo WHERE bar IN ('A','C');
SELECT fooid FROM foo WHERE bar IN ('A','C');
+-------+
| fooid |
+-------+
| 1 |
| 3 |
+-------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在Python中执行相同操作时,我没有获得任何行,而我期望有2行: …