【问题标题】:Parametric query when using 'load data infile'使用“加载数据文件”时的参数查询
【发布时间】:2020-05-12 22:53:18
【问题描述】:

为了安全起见,我使用参数查询进行正常的插入/更新。
我该如何处理这样的查询:

LOAD DATA INFILE '/filepath' INTO TABLE mytable   

在我的情况下,文件的路径每次都会不同(对于不同的请求)。像这样进行是否可以(因为我没有从外部获取任何数据,所以文件来自服务器本身):

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

【问题讨论】:

  • 您在请求许可吗?
  • @PaulSpiegel 感谢您的回复,先生。我拥有所有权限。由于一切都是在内部完成的,我想我可以使用字符串连接来格式化查询,并取消像插入/更新这样的参数查询。只是想确认一下。
  • 但是为什么呢?因为准备好的语句中不允许LOAD DATA
  • @PaulSpiegel 我正在为此使用 Python MySQLdb。
  • 那么到底是什么问题呢?为什么不像插入和更新那样使用“参数查询”?

标签: mysql load-data-infile


【解决方案1】:

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

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

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

【讨论】:

  • 我认为 OP 不是在询问“准备好的”语句,而是在询问客户端处理的“参数化”语句。请参阅this 答案,该答案表明 MySQLdb 甚至无法使用准备好的语句。
  • @totalhack - 如果没有使用准备好的语句,那么我认为没有问题。
【解决方案2】:

要回答您的“可以这样继续”的问题,您的示例代码将失败,因为生成的查询将缺少文件名周围的引号。如果您将其更改为以下内容,它可以运行,但 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,))

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

【讨论】:

  • 非常感谢,先生,您清除了有关使用字符串连接的疑虑。坚持您的建议,在这种情况下也会选择参数查询。该自动提交备注应以粗体显示。
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2019-08-24
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多