您正在格式化字符串的最后一部分:
"%'".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,))