python sqlite3 нераспознанный токен: "{" - PullRequest
0 голосов
/ 06 сентября 2018

Этот синтаксис:

consulta.execute("SELECT * FROM {0} WHERE rut LIKE '%"+str(cadena)+"%'".format(tablepx))

выдает ошибку:

sqlite3.OperationalError: unrecognized token: "{"

Я тоже пытался с этим:

consulta.execute("SELECT * FROM {0} WHERE rut LIKE ?".format(tablepx),(cadena,))

Он не отправляет ошибку, но ничего не происходит, он не работает, так как я получаю нулевые результаты из базы данных.

Я не знаю, как работать с '%" + str(cadena) +"%', я всегда работаю с .format().

1 Ответ

0 голосов
/ 06 сентября 2018

Вы форматируете последний раздел вашей строки:

"%'".format(tablepx)

перед конкатенацией к результату "..." + str(cadena). Таким образом, заполнитель {0} в строковом литерале first не заполнен, и в качестве запроса у вас остается "SELECT * FROM {0} WHERE rut LIKE '%...%'"... заменяется значением cadena).

Это можно исправить, переместив вызов .format() в строковый литерал "SELECT * FROM {0} WHERE rut LIKE '%". Или с помощью второго заполнителя {1}, чтобы показать, куда должно идти значение cadeda, вместо использования + конкатенации.

Однако , вы не должны использовать конкатенацию строк, чтобы поставить cadena в строку в первую очередь. У вас была правильная идея, используя заполнитель ? и значение параметра запроса, но вы забыли добавить символы запроса % LIKE к вашему значению cadena.

Просто добавьте % символов в начало и конец cadena, а затем используйте результат этого в качестве параметра:

like_string = '%{0}%'.format(cadena)
consulta.execute(
    "SELECT * FROM {0} WHERE rut LIKE ?".format(tablepx),
    (like_string,))

Заполнитель ? в строке запроса будет использоваться для размещения правильно экранированной строки запроса LIKE, с добавлением % в начало и конец значения cadena.

Я не могу не подчеркнуть, что использование str.format() для интерполяции имени таблицы в строку запроса (как вы делаете с tablepx) может открыть вас для проблем внедрения SQL. См. этот другой мой ответ для получения дополнительных советов по этому вопросу, а также альтернатив. Чтобы быть в безопасности, я бы по крайней мере использовал "{0}" в качестве позиции имени таблицы и tablepx.replace('"', '""'), чтобы SQLite, по крайней мере, знал, что он принимает только допустимые имена объектов в этой части строки:

like_string = '%{0}%'.format(cadena)
consulta.execute(
    'SELECT * FROM "{0}" WHERE rut LIKE ?'.format(tablepx.replace('"', '""')),
    (like_string,))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...