Python добавляет одинарную кавычку к моим параметрам запроса - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь выполнить этот запрос:

SELECT '23.34.67.0/22' CONCAT(DAY_31, 'hello') DAY_31 FROM Jule

, используя pymysql. Мой код:

cursor.execute("SELECT %s CONCAT(%s, %s) %s FROM Jule", (p, 'DAY_' + _day, as_tmp, 'DAY_' + _day))

Но python добавляет одинарную кавычку и возвращает синтаксическую ошибку

"У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашему MySQLсерверная версия для правильного синтаксиса для использования рядом с '(' DAY_31 ',' hello ')' DAY_31 'FROM Jule' в строке 1 "

DAY_31 является столбцом схемы Jule

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Причина, по которой вы получаете кавычки, заключается в том, что cursor.execute добавляет эти значения, которые вы передаете в качестве аргументов. Это полностью подходит для вашего второго аргумента, потому что, если значение «hello» было вставлено в запрос «как есть», вы бы получили запрос, подобный следующему:

 SELECT '23.34.67.0/22' CONCAT(DAY_31, hello) DAY_31 FROM Jule

, и у вас будут ошибки, сообщающие вамчто MySQL не может определить, на что должен ссылаться hello.

Очевидно, что это не подходит для ситуаций, когда вы хотите передать имена полей или любую другую частьзапрос, который не является примитивным строковым значением. В этих случаях вам нужно будет объединить их в строку перед выполнением запроса. Один из способов сделать это можно с помощью f-строк , но есть и другие альтернативы. Вот ваша строка cursor.execute с именами полей, объединенными с использованием f-строк:

cursor.execute(f"SELECT %s, CONCAT({'DAY_'+_day}, %s) {'DAY_'+_day} FROM Jule", (p, as_tmp))

Обратите внимание, что я также удалил 'DAY_'+_day из списка аргументов.

Важное примечание:

Хотя это должно работать следующим образом (хотя я думаю, что вам также понадобилась дополнительная запятая после SELECT '23.34.67.0/22', которую я добавил в приведенном выше примере), очень важно, чтобыесли day имеет значение, которое исходит из-за пределов вашего приложения (например, передано пользователем в поле формы), вы должны убедиться, что оно точно в нужном формате, прежде чем вставлять его в ваш запрос. Проверка того, что строковое значение является целым числом может быть одним из способов сделать это. Это важно по той причине, что без этого ваше приложение может быть подвержено SQL-инъекции , что потенциально позволит пользователям запускать произвольный SQL в вашей базе данных. Если значение day рассчитывается исключительно вашим приложением, вам не нужно беспокоиться об этом.

0 голосов
/ 02 октября 2019

Если память не изменяет, ? вместо %s может помочь.

...