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()
Другие вопросы по тегам