Flask+SQLite搜索函数异常:无结果显示及SQL绑定错误
Flask搜索功能故障排查与修复
核心问题梳理
你的搜索功能出现两个关键故障,对应不同代码错误:
- 原代码无结果输出:请求参数获取方式错误+SQL逻辑错误+未提取查询结果
- 修改后触发
sqlite3.ProgrammingError:SQL参数绑定写法错误
修正后的完整代码
后端app.py代码
@app.route('/search', methods=['GET', 'POST']) def search(): # 兼容GET/POST请求,正确获取搜索参数 result = request.args.get('search') or request.form.get('search') conn = get_db_connection() if not result: # 处理空搜索场景,返回全部数据 searchsmartphones = conn.execute("SELECT * FROM Smartphone").fetchall() else: # 模糊搜索的正确参数绑定写法 searchsmartphones = conn.execute( "SELECT * FROM Smartphone WHERE brand LIKE ? OR model LIKE ?", ('%' + result + '%', '%' + result + '%') ).fetchall() conn.close() # 关闭数据库连接,避免资源泄漏 return render_template('smartphone.html', searchsmartphones=searchsmartphones)
表单与模板代码
表单和模板代码无需修改,保持原内容即可。
错误细节解释
参数获取错误:
表单用GET方法提交,参数存在URL的查询串中,原代码用request.form.get无法获取参数,需改用request.args.get,同时兼容POST请求提升灵活性。SQL逻辑与绑定错误:
- 原语句
WHERE brand OR model = ?逻辑不成立,正确逻辑应为brand = ? OR model = ?; - 修改后的
LIKE '%?%'写法错误:SQLite的参数占位符?不能放在字符串引号内,否则会被识别为普通字符而非占位符,需将通配符%与搜索关键词拼接后传入。
- 原语句
未提取查询结果:
conn.execute()返回的是游标对象,必须调用fetchall()将结果转为可遍历的列表,否则模板无法渲染数据。不必要的事务操作:
SELECT查询无需执行conn.commit(),只有INSERT/UPDATE/DELETE等写操作才需要提交事务,操作完成后需关闭数据库连接。
内容的提问来源于stack exchange,提问作者Fallen Hamster
相关产品推荐
相关产品推荐

