-1

这个语法:

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()

4

1 回答 1

1

您正在格式化字符串的最后一部分:

"%'".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,))
于 2018-09-06T14:23:15.193 回答