如何用Python在SQLite数据库中查找含指定关键词的行?
解决Python操作SQLite查找含关键词记录的问题
嗨,我来帮你搞定这个查询问题~你遇到的问题主要有两个:一是最初的SQL语句没加筛选条件,二是遍历查询结果时对数据结构判断有误。下面给你两种正确的实现方式:
方法一:用SQL语句直接在数据库层面筛选(推荐)
这种方法效率更高,尤其是当你的Corpus表数据量很大的时候,让数据库帮你做筛选比把所有数据拉到Python里处理要快得多。而且一定要用参数化查询,避免SQL注入风险,不要直接把关键词拼到SQL字符串里。
import sqlite3 as lite con = lite.connect("corpus.db") c = con.cursor() keyword = input("Which keyword do you wish to find in the corpus? ") # 使用LIKE和通配符%匹配包含关键词的内容,用?作为参数占位符 c.execute("SELECT Content FROM Corpus WHERE Content LIKE ?", ('%' + keyword + '%',)) # 获取所有匹配的结果 results = c.fetchall() for text_tuple in results: # 每个结果是元组,取第一个元素就是Content的内容 print(text_tuple[0]) # 别忘了关闭连接 con.close()
解释一下:
LIKE ?里的?是SQLite的参数占位符,后面的元组('%' + keyword + '%',)是要替换的值,%是通配符,代表任意长度的任意字符,这样就能匹配包含关键词的文本了。- 最后记得关闭数据库连接,养成好习惯~
方法二:修正Python遍历的判断逻辑(适合需要额外处理数据的场景)
如果你一定要先把所有数据拉到Python里再筛选,那得修正你的判断条件,因为fetchall()返回的是元组的列表,每个元组里才是你要的Content字符串。
import sqlite3 as lite con = lite.connect("corpus.db") c = con.cursor() keyword = input("Which keyword do you wish to find in the corpus? ") # 比如输入"camera" c.execute("SELECT Content FROM Corpus") content = c.fetchall() for text_tuple in content: # 取元组的第一个元素(也就是Content的字符串),再判断关键词是否在里面 if keyword in text_tuple[0]: print(text_tuple[0]) con.close()
你之前的代码里if keyword in text是在检查关键词是否是元组的成员,而不是检查元组里的字符串包含关键词,所以才会没有输出哦~
两种方法对比
- 方法一(SQL筛选):效率高,适合大数据量,代码更简洁,还能避免SQL注入。
- 方法二(Python筛选):适合需要对所有文本做额外处理的场景,但数据量大时会很慢。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

