koa2+sequelize批量新增如何避免重复

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Koa2是一个基于Node.js的Web开发框架,它使用了ES6的语法特性,提供了一种更简洁、更优雅的方式来构建Web应用程序。Sequelize是一个强大的Node.js ORM(Object-Relational Mapping)库,它提供了对多种数据库的支持,包括SQLite、MySQL、PostgreSQL等。SQLite是一种轻量级的嵌入式数据库引擎,它不需要独立的服务器进程,可以直接嵌入到应用程序中。 使用Koa2结合Sequelize和SQLite可以实现一个简单的Web应用程序。首先,你需要安装koa2、sequelize和sqlite3这三个npm包。然后,你可以创建一个Koa2应用程序,并配置Sequelize连接到SQLite数据库。接下来,你可以定义模型(Model)来映射数据库表,并使用Sequelize提供的API进行数据的增删改查操作。 下面是一个简单的示例代码: ```javascript const Koa = require('koa'); const Sequelize = require('sequelize'); const app = new Koa(); // 配置Sequelize连接到SQLite数据库 const sequelize = new Sequelize({ dialect: 'sqlite', storage: 'path/to/database.sqlite' // SQLite数据库文件路径 }); // 定义模型 const User = sequelize.define('user', { name: Sequelize.STRING, age: Sequelize.INTEGER }); // 同步模型到数据库 sequelize.sync().then(() => { console.log('Database synced'); }).catch((error) => { console.error('Error syncing database:', error); }); // 在路由中使用模型进行数据操作 app.use(async (ctx) => { // 创建用户 const user = await User.create({ name: 'John', age: 25 }); // 查询用户 const users = await User.findAll(); // 更新用户 user.age = 26; await user.save(); // 删除用户 await user.destroy(); ctx.body = users; }); app.listen(3000, () => { console.log('Server started on port 3000'); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值