You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

其他优化点

  1. 初始搜索代码中的SQL语法错误:WHERE title = (?,) 多余的括号和逗号,正确写法是WHERE title = ?
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:06:05