Параметр c запрос при использовании «загрузить данные в файл» - PullRequest
1 голос
/ 27 января 2020

Я использую параметры c запросов для обычной вставки / обновлений в целях безопасности.
Как мне это сделать для таких запросов:

LOAD DATA INFILE '/filepath' INTO TABLE mytable   

В моем случае путь к файлу будет быть разными каждый раз (для разных запросов). Можно ли так поступить (поскольку я не получаю никаких данных извне, файл находится на самом сервере):

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

Ответы [ 2 ]

1 голос
/ 27 января 2020

Чтобы ответить на ваш вопрос «нормально ли так», ваш пример кода потерпит неудачу, потому что в результате запроса будут отсутствовать кавычки вокруг имени файла. Если вы изменили его на следующий, он мог бы работать, но все еще плохая идея 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,))

И не забудьте зафиксировать, если автокоммит не включен.

1 голос
/ 27 января 2020

Поскольку LOAD DATA не указан в SQL Синтаксис, разрешенный в подготовленных выражениях , вы не можете подготовить что-то вроде

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

, поскольку подготовленное утверждение не используется.

...