使用参数序列化全文查询



嗨,我目前正在尝试从数据库查询记录,这些是的条件

  • 我从前端收到"order by"、"order(desc/asc("、"limit"、"offset">
  • 我还需要使用match来搜索记录。。。反对。"like"搜索速度太慢
  • 有一个带有此查询的映射模型

所以我尝试了

let order_by = req.query.orderby;
let order = req.query.order;
let page = req.query.pagenum;
let perpage = req.query.parpage;
let searchword = req.query.foodsearch;
let offset = (parseInt(page) - 1) * parpage;
let foods = await models.food.findAll({
limit: parseInt(perpage),
offset: offset,
order: [
[order_by, order]
],
//  where: Sequelize.literal
//  (
//      `MATCH 
//      (Name, Place, RestoNum, Ingredient, ChefName, Region...) 
//      AGAINST
//      ( ? IN NATURAL LANGUAGE MODE)`, 
//      { replacements: [ searchword ] }
//  )
});

但这段代码中的注释部分似乎是错误的。我尝试了原始查询,但无法参数化这些order by、order、offset和limit变量。我不想像${orderby}那样添加它们,因为这有风险。

如果你对这个问题有任何解决方案,请告诉我。

提前谢谢!

您混淆了Sequelize.literal()sequelizeInstance.query()API。

  1. .literal()只接受一个字符串。如果您想在查询中使用对象表示法,那么您的注释代码将起作用。除了没有第二个论点。您需要在AGAINST子句中连接或插入搜索词。另外,不要忘记你的名言。literal()的输出本质上是一个字符串。MySQL FTS参数周围需要正确类型的引号,就像它们出现在原始SQL查询中一样
  2. .query()确实采用了一个选项参数。通过此操作,您不必使用字符串插值,可以使用命名替换或绑定参数。这不仅允许您放置在searchword参数中,还允许您放置所需的任何ORDERBY子句

我会选择选项1。这就是我们在MS SQL中为FTS所做的。

最新更新