Правильный код Python для вставки значения NULL в MySQL

Я пытаюсь вставить некоторые переменные в базу данных MySQL, используя python. Иногда переменные будут строками, а иногда они будут None.

Сильно упрощенная версия того, что я пытаюсь сделать, приведена ниже:

import MySQLdb as mdb
f = "Bob"
m = None
l = "Smith"

db = mdb.connect("blah blah blah")
with db:
    cur.execute("INSERT INTO name (first, middle, last) VALUES ('{0}', '{1}', '{2}')".format(f, m, l))

Проблема в том, что он вставляет «Нет» как строку, а не как фактическое значение NULL.

Я могу решить проблему, изменив последнюю строку на:

cur.execute("INSERT INTO name (first, middle, last) VALUES (%s, %s, %s)", (f, m, l))

но я считаю, что это оставляет код уязвимым для атак с внедрением MySQL. Если кто-нибудь знает правильный способ использования метода .format, я был бы очень признателен.


person Ken Williams    schedule 25.06.2015    source источник
comment
Нет, форматирование строк оставляет вас уязвимыми. Передача значений вторым способом - это то, что ожидается.   -  person That1Guy    schedule 25.06.2015
comment
Спасибо - я рад, что получил свои извинения за глупый вопрос в начале   -  person Ken Williams    schedule 25.06.2015
comment
Это не глупый вопрос. Важно, чтобы вы знали, как защититься от SQL-инъекций.   -  person That1Guy    schedule 25.06.2015


Ответы (1)


Ожидаемый метод вставки данных следующий:

cur.execute("INSERT INTO name (first, middle, last) VALUES (%s, %s, %s)", (f, m, l))

Форматирование строки, как в первом примере, делает ваше приложение уязвимым для SQL-инъекций.

person That1Guy    schedule 25.06.2015
comment
В яблочко. Ни deprecated %, ни .format в этом случае работать не будут. - person Neurotransmitter; 27.07.2016