首页 > 解决方案 > Python SQLite搜索具有多个关键字的帖子标题

问题描述

我在 python 中编写它时遇到了一些麻烦,除了使用字符串格式之外我似乎无法解决这个问题(强烈不推荐)

基本上我调用函数 input() 并要求用户输入一些关键字(空格分隔),我需要找到所有标题包含任何关键字的帖子。

例如,如果用户输入的是“python SQL mysql”,我需要找到与至少一个关键字匹配的所有帖子。在本例中,查询将是

SELECT posts.title FROM posts 
    WHERE lower(posts.title) LIKE "%python%" OR 
    lower(posts.title) LIKE "%sql%" OR 
    lower(posts.title) LIKE "%mysql%";

然而,问题就在这里。关键字的数量可能会有所不同。因此我不能写一个固定的 SQL 语句,比如

db.execute("SELECT posts.title FROM posts WHERE posts.title LIKE ? OR posts.title LIKE ?",("%"+keyword1+"%", "%"+keyword2+"%"))

相反,我不得不求助于 Python 中的 for 循环,例如:

query = "posts.title LIKE '%" + keywords[0] + "%'"
keywords.remove(0)
for k in keywords:
    query += "OR posts.title LIKE '%" + k +"'%"

然而,这显然是不推荐的。虽然我正在做的是一个学校项目,所以它不是关键任务,而且我们没有针对 SQL 注入攻击进行评分,但我确实想知道解决这个问题的正确方法是什么。

标签: pythonsqlsqlite

解决方案


我想我想到了一种可能是次优但更安全的方法首先,创建查询语句,但不要将 userInput 添加到其中:

query = "posts.title Like ? "
for i in range(len(keywords) - 1):
    query += "OR posts.title Like ?"

query = "SELECT posts.title FROM posts WHERE " + query

然后我使用 sqlite API 为我做这件事:

keywords = list()
for k in keywords:
    keywords.append("%" + k + "%")
keywords = tuple(keywords)
result = db.execute(query, keywords)

推荐阅读