Ответ 1
Если вы используете mysql-python, просто попробуйте
MySQLdb.escape_string(SQL)
Пример
>>> import MySQLdb
>>> MySQLdb.escape_string("'")
"\\'"
Есть ли эквивалент 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?
Если вы используете mysql-python, просто попробуйте
MySQLdb.escape_string(SQL)
Пример
>>> import MySQLdb
>>> MySQLdb.escape_string("'")
"\\'"
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
каждый раз). Конечно, если вы имеете в виду что-то совершенно другое, то вторая строка должна быть соответствующим образом изменена, но ключевая идея в любом случае состоит в том, чтобы использовать такие заполнители, а не строковое форматирование, для таких задач.
Есть ли эквивалент Python для PHP mysql_real_escape_string?
Да, это escape_string
в базе данных соединение.
Не escape_string
в модуле MySQLdb
, который эквивалентен mysql_escape_string
в PHP и имеет такую же потенциальную уязвимость с многобайтовыми наборами символов. Вы не должны использовать MySQLdb.escape_string
.
В любом случае вам гораздо лучше использовать параметризованные запросы, как в ответе Алекса. Это упрощает перенос в другие базы данных (это часть стандарта DB-API, для которого escape_string
нет), и это в целом более удобно. (И гораздо удобнее, чем параметризация в PHP.)
В этом конкретном случае вам просто нужно использовать метод executeimany курсора.
mysql_string = "INSERT INTO candidate (name, address) VALUES (%s,%s);"
cursor.executemany(mysql_string, v_dict.iteritems())
MySQLdb.escape_string
эквивалентен. Все это описано в документации.
рядом с MySQLdb.escape_string(SQL)
, библиотека pythysql python также предоставляет функцию escape_string()
.
>>> import pymysql
>>> pymysql.escape_string("'")
"\\'"
>>>