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

使用Sequelize实现多列WHERE IN查询时遇错误,求解决方案

解决Sequelize多列WHERE IN查询的错误问题

你遇到的问题是因为直接把对象数组传给Op.in的写法不符合Sequelize对多列IN查询的要求。Sequelize要生成(name, location) IN ((val1, val2), ...)这种SQL,需要用数组的数组格式来定义条件,而不是对象数组。

正确的实现方式

先把你的对象数组转换成二维数组(每组对应name和location的值),然后在查询中指定字段名数组和对应的值数组:

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

// 你的原始查询条件
const selectTrains = [ 
  {name: 'train1', location: 'us'}, 
  {name: 'train1', location: 'eu'}, 
  {name: 'train2', location: 'us'}, 
];

// 转换为二维数组:每个元素是[name, location]的组合
const queryValues = selectTrains.map(train => [train.name, train.location]);

// 执行查询
let dbTrains = await Trains.findAll({
  where: {
    [Op.in]: [['name', 'location'], ...queryValues]
  }
});

这段代码会生成你想要的SQL:

SELECT * FROM trains WHERE (name, location) IN (('train1', 'us'), ('train1', 'eu'), ('train2', 'us'));

兼容性更好的写法(适配更多数据库)

如果你的项目需要兼容MySQL以外的数据库,可以用Sequelize.fn结合row函数的方式:

let dbTrains = await Trains.findAll({
  where: Sequelize.where(
    Sequelize.fn('row', Sequelize.col('name'), Sequelize.col('location')),
    Op.in,
    queryValues
  )
});

为什么原来的代码报错?

Sequelize无法解析对象数组作为Op.in的参数,它需要明确知道要匹配哪些字段,以及每个字段对应的取值组合。直接传对象数组会让Sequelize无法正确映射字段和值,从而抛出参数无效的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:52