python sqlite3无法识别的令牌:“ {”

时间:2018-09-06 14:09:03

标签: python python-3.x sqlite

此语法:

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) +"%'

1 个答案:

答案 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('"', '""')