Flask集成Flask-msearch实现关键词搜索返回SQL语句而非结果求助
问题原因
你遇到的返回SQL语句而非查询结果的问题,由以下几个错误共同导致:
1. 查询未实际执行
msearch()方法只会构造SQLAlchemy查询对象,不会真的去数据库拉取数据,你没有调用执行方法就直接传给了模板,模板打印查询对象时自然会输出对应的SQL语句。
2. flask-msearch 配置错误
你定义的MSEARCH_INDEX_NAME、MSEARCH_ENABLE是全局变量,没有写入Flask应用的配置项,扩展根本读不到你的配置,搜索逻辑初始化不完整。
3. 扩展初始化顺序错误
配置项需要在扩展初始化、创建索引之前设置,否则配置不会生效。
修复步骤
第一步:修改__init__.py的配置和初始化顺序
import os from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_msearch import Search ... app = Flask(__name__) # 先把配置写入app.config app.config['MSEARCH_INDEX_NAME'] = os.path.join(app.root_path,'msearch') app.config['MSEARCH_ENABLE'] = True # 再初始化扩展 searched = Search(app) # 确保模型导入完成后再创建索引,你可以调整到导入模型之后的位置 searched.create_index(update=True) from .search import search as search_blueprint app.register_blueprint(search_blueprint) return app
第二步:修改search.py的查询逻辑,加执行方法.all()
@search.route('/search', methods=['POST']) def searching_post(): searchInput = request.form.get('searchInput') # 加.all() 实际执行查询获取结果列表 results = Service.query.msearch(searchInput, fields= ['description']).all() return render_template('result.html', results=results)
第三步:修改result.html的渲染逻辑,遍历查询结果
不要直接打印results变量,要遍历列表取每个对象的属性,示例:
<h1>搜索结果</h1> {% if results %} <ul> {% for item in results %} <li> <h3>{{ item.service_name }}</h3> <p>{{ item.description }}</p> <p>价格:{{ item.cost }} 评分:{{ item.rating_avg }}</p> </li> {% endfor %} </ul> {% else %} <p>没有找到匹配的结果</p> {% endif %}
可选优化(不影响功能,方便调试)
修改models.py里的__repr__方法,方便打印对象时看内容:
def __repr__(self): return f'<Service {self.service_id}: {self.service_name}>'
内容的提问来源于stack exchange,提问作者Ali Khabib
相关产品推荐
相关产品推荐

