Этот синтаксис:
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().
ах, ежедневный вопрос о конкатенации SQL-запросов. Не надо. Используйте параметризованный запрос.






Вы форматируете последний раздел своей строки:
"%'".format(tablepx)
прежде чем объединить это с результатом "..." + str(cadena). Таким образом, заполнитель {0} в строковом литерале первый не заполняется, и в качестве запроса остается "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,))
Спасибо, ребята, я запихнул эту консультацию
@Giova: однако я бы предпочел действительно не использовать этот формат, потому что любая ненадежная сторона, которая может установить значение cadena, может взломать вашу базу данных.
что я могу сделать, чтобы избежать взлома?
@Giova: используя синтаксис в конце моего ответа. Если tablepx не является тем, что пользователь предоставляет (или может предоставить часть стоимости), тогда первого примера в моем ответе будет достаточно. Оба создают like_string, сначала добавляя % в начало и конец cadena, а затем используя like_string в качестве параметра запроса.
Как выглядит
str(cadena)?