Экранирование символов в Python и SQLite
У меня есть скрипт на Python, который читает текстовые файлы с названием фильмов и сохраняет данные в базе данных SQLite.
Я использую re.escape(title)
, чтобы добавить символы экранирования в строки для безопасной вставки в базу данных.
Столкнулся с проблемой:
Когда я пытаюсь выполнить следующий запрос:
c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
Я получаю ошибку:
OperationalError: near "Allo": syntax error
Однако, если я убираю экранирование для некоторых кавычек, код работает:
c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'")
Почему так происходит? Я не могу избавиться от начальных кавычек, так как они являются частью названия фильма.
Спасибо за помощь!
3 ответ(ов)
Вы делаете это неправильно. В буквальном смысле. Вам следует использовать параметры, вот так:
c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))
Таким образом, вам не нужно будет делать никакого экранирования, и (если эти значения приходят от ненадежных источников) вы будете на 100% защищены (в данном случае) от атак типа SQL injection.
Обратите внимание, что re.escape
делает строку безопасной для регулярных выражений, а не для базы данных. Как говорит @Donal, вам необходимо использовать концепцию подстановки параметров из Python DB API – именно это делает ваши данные безопасными для базы данных.
SQLite не поддерживает последовательности экранирования с помощью обратной косой черты. Апострофы в строковых литералах указываются удвоением: '''Allo ''Allo! (1982)'
.
Однако, как заметил Донал, вам следует использовать параметры.
Python sqlite3.OperationalError: таблица не найдена
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?
Есть ли разница между поднятием экземпляра класса Exception и самого класса Exception?