Python中使用通配符进行SQLite参数替换LIKE查询

51

我试图使用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个回答

108

引号保护了?:name,使它们被当作一个文本字符而不是占位符。你需要将百分号放在传递的字符串周围,并使用没有引号的普通占位符。

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

请注意,?两侧没有引号--这样才能将它们视为占位符。


Python是否具有类似PHP的双引号变量解析功能?例如,PHP中的"$var"将解析为用引号括起来的$var的值。 - Hamman Samuel
1
@HammanSamuel,不,Python中单引号和双引号是等效的--要插入变量,必须明确指定,例如您可以使用https://docs.python.org/2/library/string.html#template-strings,将`vars()`传递给`.substitute`方法。 - Alex Martelli
哇,这真是令人惊讶!有什么解决办法吗?有没有办法将百分号放在字符串内部? - josinalvo
顺便说一句,谢谢你的回答,它非常有效。 - josinalvo

-1

虽然这不是一个确切的答案,也不是为了竞争而存在的,但是这个解决方案仍然试图回答“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%")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接