Подтвердить что ты не робот

Эквивалент Python mysql_real_escape_string, безопасный переход к MySQL?

Есть ли эквивалент Python для PHP mysql_real_escape_string?

Я пытаюсь вставить некоторые строки в базу данных MySQL прямо из Python и продолжать сбрасывать кавычки в строках.

mysql_string = "INSERT INTO candidate (name, address) VALUES  " 
for k, v in v_dict.iteritems():
    mysql_string += " ('" + v_dict['name'] + "', '" + v_dict['address'] + "'), "
mysql_string += ";"
cursor.execute(mysql_string)

Я пробовал re.escape(), но это ускользает от каждого не-алфавитно-цифрового символа в строках, что не то, что мне нужно - мне просто нужно избегать одиночных кавычек в этом экземпляре (плюс, в общем, что-нибудь еще, MySQL).

Мог бы сделать это вручную, я думаю, но есть ли более разумный способ сделать это в Python?

4b9b3361

Ответ 1

Если вы используете mysql-python, просто попробуйте

MySQLdb.escape_string(SQL)

Пример

>>> import MySQLdb
>>> MySQLdb.escape_string("'")
"\\'"

Ответ 2

cursor.executemany('INSERT INTO candidate (name, address) VALUES (%s, %s)',
                   [(v_dict['name'], v_dict['address'])] * len(v_dict))

должен делать то, что пытается сделать ваш код, - вставляя те же самые тождественные значения N раз (вы зацикливаете на v_dict.iteritems(), но полностью игнорируете переменные цикла и устанавливаете только повторное использование этих двух значения от v_dict каждый раз). Конечно, если вы имеете в виду что-то совершенно другое, то вторая строка должна быть соответствующим образом изменена, но ключевая идея в любом случае состоит в том, чтобы использовать такие заполнители, а не строковое форматирование, для таких задач.

Ответ 3

Есть ли эквивалент Python для PHP mysql_real_escape_string?

Да, это escape_string в базе данных соединение.

Не escape_string в модуле MySQLdb, который эквивалентен mysql_escape_string в PHP и имеет такую ​​же потенциальную уязвимость с многобайтовыми наборами символов. Вы не должны использовать MySQLdb.escape_string.

В любом случае вам гораздо лучше использовать параметризованные запросы, как в ответе Алекса. Это упрощает перенос в другие базы данных (это часть стандарта DB-API, для которого escape_string нет), и это в целом более удобно. (И гораздо удобнее, чем параметризация в PHP.)

Ответ 4

В этом конкретном случае вам просто нужно использовать метод executeimany курсора.

mysql_string = "INSERT INTO candidate (name, address) VALUES  (%s,%s);"
cursor.executemany(mysql_string, v_dict.iteritems())

Ответ 5

MySQLdb.escape_string эквивалентен. Все это описано в документации.

Ответ 6

рядом с MySQLdb.escape_string(SQL), библиотека pythysql python также предоставляет функцию escape_string().

>>> import pymysql
>>> pymysql.escape_string("'")
"\\'"
>>>