Вы форматируете последний раздел вашей строки:
"%'".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,))