Выход из символов в Python и sqlite

У меня есть сценарий Python, который читает необработанные текстовые файлы фильма в sqlite базу данных.

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

Почему делает это не работает:

In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
--------------------------------------------------------------------------- OperationalError                       Traceback (most recent call last)

/home/rajat/Dropbox/amdb/<ipython console> in <module>()

OperationalError: near "Allo": syntax error

Все же это работает (удаленный \' в двух местах):

In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90>

Я не могу понять это. Я также не могу угробить тех, которые ведут кавычки, потому что они - на самом деле часть названия фильма.Спасибо.

44
задан lesmana 1 February 2012 в 21:56
поделиться

3 ответа

Вы делаете это неправильно. Буквально. Вы должны использовать параметры, например, так:

c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))

Таким образом, вам не нужно будет делать никакого цитирования вообще и (если эти значения приходят от кого-то недоверенного) вы будете на 100% защищены (здесь) от атак SQL-инъекций.

104
ответ дан 26 November 2019 в 21:48
поделиться

Я использую re.escape (title), чтобы добавить escape символы в строки, чтобы сделать их db safe

Обратите внимание, что re.escape делает строку re -safe - не имеет ничего общего с безопасностью db . Скорее, как говорит @Donal, вам нужна концепция подстановки параметров API Python DB - , которая делает вещи «безопасными для баз данных», как вам нужно.

11
ответ дан 26 November 2019 в 21:48
поделиться

SQLite не поддерживает escape-последовательности с обратной косой чертой. Апострофы в строковых литералах обозначаются их удвоением: '' 'Allo' 'Allo! (1982) ».

Но, как сказал Донал, вы должны использовать параметры.

7
ответ дан 26 November 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: