【问题标题】:Python SQLite parameter substitution with wildcards in LIKE在 LIKE 中使用通配符替换 Python SQLite 参数
【发布时间】:2011-03-07 12:32:58
【问题描述】:

我正在尝试将参数化的 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%'"... 会返回数百个结果,也不会返回任何结果

有什么建议吗?

【问题讨论】:

    标签: python sqlite sql-like


    【解决方案1】:

    引号保护?:name 不被当作占位符——它们是按字面意思理解的。您需要在要传递的字符串周围放置百分号,并使用不带引号的普通占位符。即:

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

    请注意,? 都不是用引号引起来的——这正是它们应该被视为占位符的原因。

    【讨论】:

    • @huntler,总是乐于提供帮助!
    • Python 是否对双引号中的变量进行类似 PHP 的解析?例如PHP 中的"$var" 将解析为用引号括起来的$var 的值。
    • @HammanSamuel,不,在 Python 中单引号和双引号是等价的——要插入变量,您必须是明确的,例如,您可以使用 docs.python.org/2/library/string.html#template-strings,例如将 vars() 传递给 .substitute 方法.
    • 哇,这太令人惊讶了!有什么办法吗?有什么方法可以将 % 放入字符串中?
    • 顺便说一句,谢谢你的回答,它就像一个魅力
    【解决方案2】:

    虽然不是对问题的确切答案,也不是为了成为一个问题的答案,但这个解决方案仍然试图回答“LIKE 中的参数替换”,因为标题也考虑到了这一点(就像它对我所做的那样)


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

    虽然字段名称需要卫生,但在小型测试项目中使用就足够了。还将“%”通配符从查询移动到参数允许用户使用其他通配符。

    数据库.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%")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-23
      • 2014-12-20
      • 2021-12-22
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多