Найти - Пользователи
Полная версия: Экранирование символов
Начало » Python для новичков » Экранирование символов
1
tmpnikl
Здравствуйте
Python 3.8.2, windows 10
Как можно обновить бд MySQL, если в переменной спецсимволы, т.е.
с такой переменной обновляется
data1=“11111”
cursor.execute(f“UPDATE `s` SET `p`={data1} WHERE `id`=6”)
а вот с такой переменной выходит ошибка
data1='<span style=“font-size: 16px;”><strong><b> и т.д.'
PS: в PHP есть функция mysql_real_escape_string(), но в python(е), не могу найти подобную
Striver
 data1='<span style=“font-size: 16px;”><strong><b> и т.д.'
cursor.execute("UPDATE `s` SET `p`=%s WHERE `id`=6", (data1,))

В документации к модулю pcycopg2 (библиотека доступа к БД Postgresql) есть такое место:

Warning
Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.
Гугл переводит это так:
Предупреждение
Никогда, никогда, НИКОГДА не используйте конкатенацию строк Python (+) или интерполяцию строковых параметров (%) для передачи переменных в строку запроса SQL. Даже под дулом пистолета.

Это писали ещё до появления f-строк в Питоне, но к ним это тоже относится.
tmpnikl
Спасибо за ответ, правда непонятно, где у меня конкатенация строки(+нигде нет), подставил вместо {} знак %, но это не решило проблему, наверное я не всё указал, у меня библиотека import pymysql.cursors
Striver
но это не решило проблему, наверное я не всё указал, у меня библиотека import pymysql.cursors
Неважно, какая у тебя библиотека, все библиотеки доступа к СУБД в Питоне действуют максимально похожим образом. Ты просто вообще не понял, что я тебе написал. Нельзя подставлять данные из переменных в SQL-строку. Их нужно отдельно применять внутри команды cursor.execute вторым параметром в виде кортежа из переменных.

Вот пример из документации к твоей библиотеке pymysql.cursors:
 with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

Здесь значения ‘webmaster@python.org’ и ‘very-secret’ в SQL не вставляют, их отдельно добавляют при вызове cursor.execute.
tmpnikl
Большое спасибо за помощь, Вы мне очень помогли, правда остался маленький вопросик, почему две переменные начинаются на букву s((%s, %s))?
Striver
почему две переменные начинаются на букву s((%s, %s))?
Как я понимаю, это про строковый тип.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB