使用 '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,))
如果未启用自动提交,请不要忘记提交。
为了安全起见,我对正常 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,))
如果未启用自动提交,请不要忘记提交。