Python+SQLite3搜索查询问题排查及模糊搜索优化求助
问题分析与解决方案
核心问题1:模糊搜索缺少通配符
SQLite的LIKE操作符需要配合通配符%实现模糊匹配:
%关键词%:匹配包含关键词的内容关键词%:匹配以关键词开头的内容%关键词:匹配以关键词结尾的内容
你当前的代码直接将用户输入作为LIKE的参数,相当于精确匹配,和=效果一致,所以无法实现模糊搜索。
修正后的搜索代码
if request.method == "POST": conn = sqlite3.connect('jobs.db') c = conn.cursor() user_input = request.form["search"] # 为输入内容添加前后通配符,实现包含匹配 search_pattern = f"%{user_input}%" data = c.execute('''SELECT * FROM job WHERE title LIKE ?''', (search_pattern,)).fetchall() print("USER INPUT:" + user_input) print(data) for d in data: print(d) # 关闭数据库连接 conn.close() return render_template("search.html", data=data, user_input=user_input)
核心问题2:数据插入未提交
你的爬取插入代码中,执行INSERT后没有调用conn.commit(),导致数据只在内存中,没有真正写入数据库,这也是最初搜索无结果的关键原因。同时过于宽泛的except会隐藏错误,不利于排查问题。
修正后的插入代码
def getJobsData(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'} r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, 'html.parser') data = [] for e in soup.select('.card'): data.append({ 'title': e.h2.text.strip(), # 去除首尾空白,避免匹配时的干扰 'desc': e.ul.get_text('\n', strip=True) }) # 在函数内创建数据库连接,避免外部连接的上下文问题 conn = sqlite3.connect('jobs.db') c = conn.cursor() try: for item in data: c.execute('''INSERT INTO job VALUES(?,?)''', (item['title'], item['desc'])) # 提交事务,写入数据 conn.commit() print(f"成功插入{len(data)}条数据") except Exception as e: # 捕获具体异常并打印,方便排查 print(f"插入数据失败: {str(e)}") # 回滚事务 conn.rollback() finally: # 确保连接关闭 conn.close() return
其他优化点
- 初始搜索代码中的SQL语法错误:
WHERE title = (?,)多余的括号和逗号,正确写法是WHERE title = ? - 使用
with语句管理数据库连接,自动处理关闭,更安全:
# 搜索代码中改为with写法 with sqlite3.connect('jobs.db') as conn: c = conn.cursor() search_pattern = f"%{user_input}%" data = c.execute('''SELECT * FROM job WHERE title LIKE ?''', (search_pattern,)).fetchall()
内容的提问来源于stack exchange,提问作者hemoglobin
相关产品推荐
相关产品推荐

