sequelize提供了批量插入数据的方法:Model.bulkCreate([…object])
let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];
let data = await model.bulkCreate(params);
以上代码便可以批量在数据库中插入数据,但是默认不会过滤掉重复的内容,比如我这次的数组里已经有张三这个人,下一次我插入数据库中就应该只插入小李而不会再次存入张三。
我们先来看下面这张图:
如上图所示,我们可以用到的方法是updateOnDuplicate
let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];
let data = await model.bulkCreate(params,{
updateOnDuplicate:['name','age']
});
这样使用是没有问题的,不过我们在定义数据模型的时候还要在这两个字段加上唯一索引,不然是无效的,如下:
name: {
type: DataTypes.STRING(128),
unique: true, //表示唯一的
allowNull: false, //将 allowNull 设置为 false 将为该列添加 NOT NULL
},
age: {
type: DataTypes.INTEGER,
unique: true, //表示唯一的
allowNull: false, //将 allowNull 设置为 false 将为该列添加 NOT NULL
},
如果这样不行,检查下数据库该字段是否已经设置唯一索引,如果可以就不用往下滑了
如上步骤后,很漂亮,我程序还是能多次插入重复数据。
我的以下解决方案,不推荐数据量过大的数据库进行使用
首先我在插入的时候先查一遍数据库是否有该内容,但是数据量过大,每次查询所有,如果mysql是几万条数据,这样肯定是不行的,为了能够更快的运行和查询,使用批量的查询方式,但是得限制一下,数据的批量新增必须控制在一两百条这样子。
let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];
let where = ["张三","小李"];
let ParamsFind = await model.findAll({ //批量查询数据
attributes:['name','age'],
where:{
name:{
[Op.in]: where
}
}
})
for(let item of ParamsFind){ //查到的sql
for (var i = params .length - 1; i >= 0; i--) { //过滤的数组
if(params[i].name== item.dataValues.name) {
params.splice(i, 1);
}
}
}
let data = await model.bulkCreate(params);
如上逻辑,完美的解决了我的问题。。。
如果大家有什么疑问或者更好的解决方案,欢迎留言讨论或加v hua658818