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

时间:2010-06-23 20:25:24

标签: python sqlite sql-like

我试图在Python的Sqlite库中使用参数化的LIKE查询,如下所示:

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%'"...也会返回数百个结果

有什么建议吗?

2 个答案:

答案 0 :(得分:66)

引号可以保护?:name不被视为占位符 - 它们是字面上的。您需要在所传递的字符串周围放置百分号,并使用没有引号的普通占位符。即:

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

请注意,?都不在引号中 - 这与它们作为占位符应该完全一样。

答案 1 :(得分:0)

尽管不是问题的确切答案,也不是竞争一个人,但是此解决方案仍然尝试回答“ LIKE中的参数替换”,因为标题也引起了人们的注意(就像对我一样)


我以类似的方式工作,我将两种样式结合在一起。这样,用户可以在搜索参数本身中将字段名称以及“%”输入到函数中。

尽管字段名称需要卫生,但足以在小型测试项目中使用。还可以将“%”通配符从查询移至参数,从而允许用户使用其他通配符。

database.py

def find_item(field,term):
    cursor.execute("""
        SELECT rowid,* FROM customers
        WHERE (%s) LIKE ?
    """%field,(term,))

app.py

import database
database.find_item("first_name","%li%")
database.find_item("email","_li%")