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

Sequelize使用where.push时如何调整WHERE子句的括号优先级

解决方案

你的问题本质是SQL逻辑运算符优先级导致的:SQL中AND的优先级天然高于OR,你零散向where数组中推入条件的写法,会让Sequelize将最后一个OR条件和后续的AND条件优先结合,最终生成的括号不符合预期。

你需要将所有需要作为一组的OR逻辑用Sequelize内置的Op.or操作符封装,Sequelize会自动为这组条件加上外层括号,再和sId的AND条件并列即可。

第一步:引入操作符

首先引入Sequelize的逻辑操作符:

const { Op } = require('sequelize');

第二步:构造查询条件

写法1:直接构造完整where对象(推荐)

const where = {
  [Op.and]: [
    // 所有OR条件会被自动套上外层括号
    {
      [Op.or]: [
        { version: false },
        { name: { [Op.like]: `%${id1}%` } },
        { name: { [Op.like]: `%${id2}%` } }
      ]
    },
    // 独立的AND条件
    { sId: { [Op.in]: sIds } }
  ]
};

写法2:使用push方法(兼容你原来的写法习惯)

const where = [];
// 先推入整个OR条件组
where.push({
  [Op.or]: [
    { version: false },
    { name: { [Op.like]: `%${id1}%` } },
    { name: { [Op.like]: `%${id2}%` } }
  ]
});
// 再推入sId的IN查询条件
where.push({ sId: { [Op.in]: sIds } });

优化说明

上面的写法没有使用Sequelize.literal拼接LIKE语句,避免了SQL注入风险,是更安全的Sequelize原生写法,最终生成的SQL结构和你期望的完全一致。


内容的提问来源于stack exchange,提问作者CycleGeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:15:01