python - 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 注入攻击进行评分,但我确实想知道解决这个问题的正确方法是什么。
解决方案
我想我想到了一种可能是次优但更安全的方法首先,创建查询语句,但不要将 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)
推荐阅读
- python - 在具有 tensorflow 后端的 keras 中重用内核权重
- java - 无法上传包含在火狐浏览器上
- android - 蓝牙打印机打印 QR Image android studio
- javascript - 在 Reactjs 中创建一个可折叠的 ul li
- python - 如何从新文件开始新的 while 循环——Python 3(使用 Pygame)
- ubuntu - TCP 窗口大小卡住了
- jquery - 更改 HTML 中 jQuery 数据表的背景颜色
- reporting-services - SSRS - 将数据集值与硬编码值匹配
- python - 正确实施__lt__
- java - What is wrong in my approach to create a list of integers using IntStream and forEach?