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

使用Sequelize bulkCreate时如何仅获取新插入的行?

解决Sequelize bulkCreate返回重复项的问题

当使用bulkCreate并设置ignoreDuplicates: true时,Sequelize会返回所有传入的实例(包括被忽略的重复项),要仅获取新插入的记录,有两种可行方案:

方案一:过滤返回结果的isNewRecord属性

Sequelize的模型实例会携带_options.isNewRecord属性,标记该实例是否是本次操作新创建的。直接过滤即可:

const createdUsers = await users.bulkCreate(usersArr, {
    ignoreDuplicates: true,
});
// 筛选出真正新插入的用户
const newlyInsertedUsers = createdUsers.filter(user => user._options.isNewRecord);

方案二:先过滤重复项再插入

先查询数据库中已存在的email,提前过滤掉重复的用户,再执行批量插入,此时返回的结果自然全是新插入的记录:

// 获取数据库中已存在的目标email列表
const existingEmails = await users.findAll({
    attributes: ['email'],
    where: { email: usersArr.map(item => item.email) }
}).then(rows => rows.map(row => row.email));

// 过滤出不存在的用户数据
const newUsersToInsert = usersArr.filter(user => !existingEmails.includes(user.email));

// 批量插入新用户
const createdUsers = await users.bulkCreate(newUsersToInsert);

方案对比

  • 方案一:代码简洁,无需额外查询,但依赖Sequelize内部属性,若框架版本更新可能存在兼容性风险。
  • 方案二:逻辑更清晰,不依赖框架内部属性,兼容性更好,但多一次数据库查询,性能略低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:12:32