使用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
相关产品推荐
相关产品推荐

