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

