Peewee execute_sql с экранированными символами
Я написал запрос, который имеет некоторые замены строк. Я пытаюсь обновить URL в таблице, но URL имеет знаки%, в которых tuple index out of range exception
,
Если я распечатываю запрос и запускаю его вручную, он работает нормально, но через peewee возникает проблема. Как я могу обойти это? Я предполагаю, что это потому, что процентные знаки?
query = """
update table
set url = '%s'
where id = 1
""" % 'www.example.com?colour=Black%26white'
db.execute_sql(query)
2 ответа
Код, которым вы сейчас делитесь, невероятно небезопасен, вероятно, по той же причине, что и ваша ошибка. Пожалуйста, не используйте его в производстве, или вы будете взломаны.
Как правило: вы практически никогда не хотите использовать обычные строковые операции, такие как %
, +
, или же .format()
построить запрос SQL. Скорее, вам следует использовать специальные встроенные методы SQL API/ORM для предоставления динамических значений для запроса. В вашем случае SQLite в peewee это выглядит так:
query = """
update table
set url = ?
where id = 1
"""
values = ('www.example.com?colour=Black%26white',)
db.execute_sql(query, values)
Механизм базы данных автоматически позаботится о любых специальных символах в ваших данных, поэтому вам не нужно беспокоиться о них. Если вы когда-либо сталкиваетесь с проблемами, связанными со специальными символами в ваших данных, это очень сильный признак того, что существует какая-то проблема безопасности.
Это упоминается в разделе " Безопасность и SQL-инъекция " документации peewee.
Wtf ты делаешь? Peewee поддерживает обновления.
Table.update(url=new_url).where(Table.id == some_id).execute()