【问题标题】:Using a Variable Number of WHERE Clauses to Match an Arbitrary Number of Keywords pysqlite使用可变数量的 WHERE 子句匹配任意数量的关键字 pysqlite
【发布时间】:2013-10-22 01:20:50
【问题描述】:

我正在使用 pysqlite 构建和搜索关键字数据库 + 对应于每个关键字的 URL 集。我搜索数据库的策略适用于 1 个关键字,因为它只需要 SQL 语句中的 1 个 WHERE 子句。类似的东西:

  ... WHERE lexicon.word=?", keyword) 

但是,我想将任意数量的关键字与我的数据库匹配,我认为这相当于在它们之间有几个带有 OR 语句的 WHERE 子句。由于我不知道我会得到多少个关键字,所以我不能假设特定数量的 WHERE 子句并使用 API 的替换能力填充它们。

我相信我可以使用 Python 的字符串插入操作来使用我找到的每个关键字的 OR 语句来破坏 WHERE 语句。不过,我很确定这很 hacky,因为它可能导致注入攻击漏洞。

我也考虑过使用 .executemany() 函数,但它会运行许多单独的选择,而不是包含所需的所有 WHERE 子句的选择。

有没有比我提到的字符串替换方法更好的方法呢?我对 SQL 很陌生,所以请容忍我和我的无知。谢谢。

【问题讨论】:

    标签: python sql sqlite where-clause pysqlite


    【解决方案1】:

    一个 SQL 查询只能有一个 WHERE 子句,但您可以使用 OR 连接多个比较,或者只使用一个 IN 表达式:

    db.execute("SELECT ... WHERE lexicon.word IN (?,?,?)",
               ['Hello', 'world', 'meow'])
    

    要构造这样的语句,您只需要一点点字符串处理:

    keywords = ['Hello', 'world', 'meow']
    sql = "SELECT ... WHERE lexicon.word IN (" + ",".join(["?"] * len(keywords)) + ")"
    db.execute(sql, keywords)
    

    【讨论】:

    • 这几乎是我最终得出的结论,但做得更简洁。我想我只是想避免字符串处理,但这似乎是最简单的路线。
    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多