Flask使用MySQL执行多OR LIKE条件搜索查询报错如何解决
问题根因
你写的SQL语句里有2个{}字符串占位符,但调用str.format()方法时只传入了1个searchbox参数,参数数量和占位符数量不匹配,Python会直接抛出索引越界异常,导致接口报错,前端自然收到错误响应。
你手动替换占位符时是给两个LIKE条件都填了相同的值,所以在DBeaver里执行不会出错。
修复方案
首先不要用字符串拼接的方式构造SQL语句,这种写法存在严重的SQL注入风险,应该用MySQL驱动自带的参数化查询能力,同时解决占位符数量不匹配的问题:
修复后的Flask后端代码
from flask import render_template, request, redirect, url_for, session, flash, jsonify @terapia.route('/livesearch', methods=["POST","GET"]) def livesearch(): searchbox = request.form.get('text', '') cur = mysql.connection.cursor() # 用%s做参数占位符,参数通过execute的第二个参数传入 query = """ SELECT terapia.*,terapeuta.nombre,cliente.nombres, especialidad.descripcion FROM terapia LEFT JOIN terapeuta ON terapeuta.id_terapueta = terapia.terapeuta_id_terapueta LEFT JOIN cliente ON cliente.id_cliente = terapia.cliente_id_cliente LEFT JOIN especialidad ON especialidad.id_especialidad = terapeuta.id_especialidad WHERE especialidad.descripcion LIKE %s OR terapeuta.nombre LIKE %s """ # 两个占位符对应两个参数,通配符%直接放在参数值里 params = (f"{searchbox}%", f"{searchbox}%") try: cur.execute(query, params) result = cur.fetchall() except Exception as e: # 可自行添加日志记录错误 result = [] finally: # 关闭游标避免连接泄漏 cur.close() return jsonify(result)
前端可选优化
添加错误回调方便后续排查问题:
<div class="col-md-12"> <input type="text" id="livebox"> <p id="search-response"></p> </div> <script> $(document).ready(function(){ $("#livebox").on("input", function(e){ let textinlivebox = $("#livebox").val(); $.ajax({ method: "POST", url: "/terapia/livesearch", data:{text: textinlivebox}, success: function(res){ console.log(res) }, error: function(xhr, err){ console.log("请求异常", err) } }) }); }); </script>
内容的提问来源于stack exchange,提问作者Cromewar
相关产品推荐
相关产品推荐

