使用可变数量的WHERE子句匹配任意数量的关键字pysqlite

时间:2013-10-22 01:20:50

标签: python sql sqlite where-clause pysqlite

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

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

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

我相信我可以使用Python的字符串插入操作来修改WHERE语句,并为我找到的每个关键字添加一个OR语句。我很确定这是非常hacky,因为它可能导致注入攻击漏洞。

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

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

1 个答案:

答案 0 :(得分: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)