为了安全起见,我使用参数查询进行普通的插入/更新。
对于这样的查询,我该怎么做:
LOAD DATA INFILE '/filepath' INTO TABLE mytable
就我而言,文件路径每次都会有所不同(针对不同的请求)。这样进行是否可以(因为我没有从外部获取任何数据,所以文件来自服务器本身):
path = /filepath
"LOAD DATA INFILE" + path + "INTO TABLE mytable"
为了安全起见,我使用参数查询进行普通的插入/更新。
对于这样的查询,我该怎么做:
LOAD DATA INFILE '/filepath' INTO TABLE mytable
就我而言,文件路径每次都会有所不同(针对不同的请求)。这样进行是否可以(因为我没有从外部获取任何数据,所以文件来自服务器本身):
path = /filepath
"LOAD DATA INFILE" + path + "INTO TABLE mytable"
由于SQL Syntax Allowed in Prepared Statements中未列出LOAD DATA
,因此您无法准备类似的东西
LOAD DATA INFILE ? INTO TABLE mytable
但是列出了SET
。因此,解决方法可能是准备并执行
SET @filepath = ?
然后执行
LOAD DATA INFILE @filepath INTO TABLE mytable
在具有MySQLdb的Python中,以下查询应正常工作
LOAD DATA INFILE %s INTO TABLE mytable
因为没有使用准备好的语句。
,要回答“是否可以像这样进行”这样的问题,您的示例代码将失败,因为结果查询将缺少文件名周围的引号。如果将其更改为以下内容,则可以运行,但是IMO仍然不是一个好主意:
path = "/filepath"
sql = "LOAD DATA INFILE '" + path + "' INTO TABLE mytable" # note the single quotes
尽管您今天可能不接受外部输入,但是代码可以保留并重复使用/复制,因此您应该以可以转义参数的方式使用API:
sql = "LOAD DATA INFILE %s INTO TABLE mytable"
cursor.execute(sql,(path,))
如果未启用自动提交功能,请不要忘记提交。