SQLite3 ОБНОВЛЕНИЕ ошибки в Python - PullRequest
1 голос
/ 15 ноября 2011

Я получаю сообщение об ошибке «Ошибка оператора рядом с«? »», Когда я запускаю следующую инструкцию SQL; ключ и значение

    key = 'field_a'
    value = '01/01/2011'
    #self.testac = '010101010'

    self.qry.execute('''UPDATE data_base SET ?=? WHERE atnumber = ?''',(key, value, self.testac))
    self.qry.commit()

генерируются динамически на основе поля, которое пользователь хочет редактировать.почему оператор SET имеет? =?

Есть идеи?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

Скорее всего, синтаксис ? предназначен только для привязки параметров.То есть вставка значений связанных параметров, преобразованных соответствующим образом отформатированными и экранированными строками.Это не обычное средство подстановки строк - просто используйте обычную подстановку строк для имен столбцов.

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

key = 'field_a'
value = '01/01/2011'
#self.testac = '010101010'

sql = '''UPDATE data_base SET %(key)s=? WHERE atnumber = ?''' % dict(key=key)
self.qry.execute(sql, (value, self.testac))
2 голосов
/ 16 ноября 2011

Синтаксис ? предназначен только для значения привязки для защиты от атак внедрения ( пример ).

Если вы собираетесь использовать пользовательский ввод для левой стороны =, вы должны убедиться, что его санируйте самостоятельно. Для динамического генерирования операторов будет работать любой метод строки Python, но ты действительно не должен этого делать.

Лучше было бы иметь словарь пар {key:sql_str}

call_dict = {'col_name':'UPDATE data_base SET col_name=? WHERE atnumber=?'}
self.qry.execute(call_dict[key],(value,self.testac))

[редактировать, исправлена ​​опечатка]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...