Форматирование строки для SQL-запроса

Я снимаю запрос через python вот так:

cur.execute("INSERT INTO tblMQTTtest (string) VALUES ('test')")
con.commit()

который отлично работает. Но если я перейду к делу и воспользуюсь пробелом, я получаю сообщение об ошибке: /

var1 = 'mystring'
cur.execute("INSERT INTO tblMQTTtest (string) VALUES (%s)", (var1))
con.commit()

Ошибка:

File "mqtt1.py", line 25, in write
cur.execute("INSERT INTO tblMQTTtest (string) VALUES (%s)", (var1))
TypeError: not all arguments converted during string formatting

Любые идеи?

(var1) не является кортежем. Это просто переменная в скобках. Должен быть (var1,)
khelwood 23.11.2018 18:53

Я не ожидал, что мне придется использовать кортеж для одного значения. Это работает, и это сводило меня с ума. Спасибо!

Matthias 23.11.2018 18:56

При повторном чтении дубликата я могу подтвердить, что он ответил бы на мой вопрос, если бы я читал его, зная кортеж.

Matthias 23.11.2018 19:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
65
1

Ответы 1

Думаю, нужно заменить запятую на%. Python не умеет заполнять %s без оператора %. Пытаться:

cur.execute("INSERT INTO tblMQTTtest (string) VALUES (%s)" % var1 )

Это плохой совет. Вы не должны вставлять переменные в свой SQL. ОП был прав, передав переменные отдельно в execute. xkcd.com/327

khelwood 23.11.2018 18:58

Вы можете объяснить, почему это плохой совет?

J. Behnken 23.11.2018 19:33
en.wikipedia.org/wiki/SQL_injection
khelwood 23.11.2018 19:34
xkcd.com/327
gilch 23.11.2018 19:43

Другие вопросы по теме