使用 'load data infile' 时的参数查询

Parametric query when using 'load data infile'

为了安全起见,我对正常 insert/updates 使用参数查询。
对于这样的查询,我该怎么做:

LOAD DATA INFILE '/filepath' INTO TABLE mytable   

在我的例子中,文件的路径每次都会不同(针对不同的请求)。可以这样进行吗(因为我没有从外部获取任何数据,文件来自服务器本身):

 path = /filepath
 "LOAD DATA INFILE" + path + "INTO TABLE mytable"

由于 LOAD DATA 未在 SQL Syntax Allowed in Prepared Statements 中列出,因此您无法准备类似

的内容
LOAD DATA INFILE ? INTO TABLE mytable

但列出了 SET。所以解决方法可能是准备和执行

SET @filepath = ?

然后执行

LOAD DATA INFILE @filepath INTO TABLE mytable

更新

在 Python 和 MySQLdb 中,以下查询应该有效

LOAD DATA INFILE %s INTO TABLE mytable

因为没有使用准备好的语句。

为了回答您的 "is it fine to proceed like this" 问题,您的示例代码将失败,因为生成的查询将缺少文件名周围的引号。如果您将其更改为以下内容,它可以 运行,但在我看来仍然是个坏主意:

 path = "/filepath"
 sql = "LOAD DATA INFILE '" + path + "' INTO TABLE mytable" # note the single quotes

虽然您今天可能不接受外部输入,但代码有一种方法可以坚持并获得 reused/copied,因此您应该以一种可以转义参数的方式使用 API:

sql = "LOAD DATA INFILE %s INTO TABLE mytable"
cursor.execute(sql, (path,))

如果未启用自动提交,请不要​​忘记提交。