Python: sqlite3.OperationalError: рядом с "<": синтаксическая ошибка (обновление поля sqlite3 с исходным кодом html)

Я хотел бы изменить все вхождения sometext (соответствующие всем комбинациям регистров, таким как sometext, SOMETEXT, SOmeTExt) в поле note таблицы itemNotes sqlite.

Поскольку sqlite не поддерживает обновление без учета регистра (я уже задаю 2 вопроса здесь и здесь ), я использую python и regex.

Но я получаю эту ошибку: sqlite3.OperationalError: near "<": syntax error совпадающая строка cursor.execute(f'REPLACE

У меня нет < в моем коде, поэтому я думаю, что это происходит из поля note, которое содержит исходный код html.

Вот мой код:

keyword  = "sometext"
replacement_word = "abc"

# load sqlite3
db = sqlite3.connect(path_to_sqlite)
cursor = db.cursor()

# search for all therm
cursor.execute(f'SELECT * FROM itemNotes  WHERE note like "%{keyword}%"')
print("\nfetch one:")
# itemID_list = cursor.fetchone()

# pour chacun des result, change
for row in cursor.fetchall():
    # print(each)
    row_regex = re.compile(re.escape(keyword), re.IGNORECASE)
    row_regex_replaced = row_regex.sub(replacement_word, row[2])

    rowindex = row[0]
    cursor.execute(
        f'REPLACE INTO itemNotes (note) VALUES ({row_regex_replaced}) where itemID = {rowindex}')

После поиска «инъекции sql» я придумал следующее:

sql = "REPLACE INTO itemNotes (note) VALUES (?) where itemID = (?)"
data = (row_regex_replaced, rowindex,)
cursor.execute(sql, data)

Но теперь я получаю эту ошибку: sqlite3.OperationalError: near "where": syntax error

Найдите «SQL-инъекцию»

Shawn 28.05.2019 16:47

@Shawn, спасибо за это, я меняю свой код, чтобы защитить его от SQL-инъекций.

MagTun 28.05.2019 17:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из документ sqlite:

The REPLACE command is an alias for the "INSERT OR REPLACE" variant of the INSERT command.

В INSERT нет пункта WHERE. Запрос нужно написать как «обычный» INSERT, а система сама «решит», стоит ли заменять. Что-то вроде INSERT into itemNotes (itemID,note) VALUES (?,?). (Обратите внимание, что порядок списка data в приведенном выше примере необходимо изменить).

Другие вопросы по теме