У меня есть сценарий 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>
Я не могу понять это. Я также не могу угробить тех, которые ведут кавычки, потому что они - на самом деле часть названия фильма.Спасибо.
Вы делаете это неправильно. Буквально. Вы должны использовать параметры, например, так:
c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))
Таким образом, вам не нужно будет делать никакого цитирования вообще и (если эти значения приходят от кого-то недоверенного) вы будете на 100% защищены (здесь) от атак SQL-инъекций.
Я использую re.escape (title), чтобы добавить escape символы в строки, чтобы сделать их db safe
Обратите внимание, что re.escape
делает строку re -safe - не имеет ничего общего с безопасностью db . Скорее, как говорит @Donal, вам нужна концепция подстановки параметров API Python DB - , которая делает вещи «безопасными для баз данных», как вам нужно.
SQLite не поддерживает escape-последовательности с обратной косой чертой. Апострофы в строковых литералах обозначаются их удвоением: '' 'Allo' 'Allo! (1982) »
.
Но, как сказал Донал, вы должны использовать параметры.