Я хотел бы изменить все вхождения 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
@Shawn, спасибо за это, я меняю свой код, чтобы защитить его от SQL-инъекций.
Из документ 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
в приведенном выше примере необходимо изменить).
Найдите «SQL-инъекцию»