此语法:
select_features
产生错误:
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) +"%'
。
答案 0 :(得分:1)
您正在格式化字符串的最后一部分:
"%'".format(tablepx)
,然后将其连接到"..." + str(cadena)
的结果。因此,不会填充 first 字符串文字中的{0}
占位符,并且您将"SELECT * FROM {0} WHERE rut LIKE '%...%'"
作为查询(...
被{{ 1}})。
您可以通过将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()
所做的那样)可以解决SQL注入问题。有关更多建议以及替代方法,请参见this other answer of mine。为了安全起见,我至少要使用tablepx
作为表名位置和"{0}"
,以便SQLite至少知道只接受字符串那部分中的有效对象名:
tablepx.replace('"', '""')