Подтвердить что ты не робот

Исключение символов в Python и sqlite

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

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

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

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>

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

У меня есть один простой совет, который вы можете использовать для решения этой проблемы: Когда строка оператора SQL имеет одинарную кавычку: ', вы можете использовать двойную кавычку, чтобы заключить строку оператора. И когда ваша строка оператора SQL имеет двойные кавычки: ", вы можете использовать одиночную кавычку:", чтобы заключить строку вашего оператора. Например.

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

Или

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

Это решение работает для меня в среде Python.