在LIKE中使用通配符替换Python SQLite参数


问题内容

我正在尝试将参数化的LIKE查询与Python的Sqlite库一起使用,如下所示:

self.cursor.execute("select string from stringtable where string like '%?%' and type = ?", (searchstr,type))

但是?通配符的内部没有被评估,这让我错了:

"sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied."

我还尝试将标记的查询版本用于:

like '%:searchstr%' 并且在列表中具有 {"searchstr":searchstr...

但是当我这样做时,查询会运行,但是即使手动将"like '%a%'"...返回的数百个结果按原样应该输入,也不会返回任何结果

有什么建议吗?


问题答案:

引号可以保护?:name防止被用作占位符-它们是按字面意义使用的。您需要将百分号放在要传递的字符串周围,并使用不带引号的普通占位符。即:

self.cursor.execute(
  "select string from stringtable where string like ? and type = ?",
  ('%'+searchstr+'%', type))

请注意,两者都不用?引号引起来,这与将它们用作占位符完全相同。