sequelize是没有支持 bulkUpsert这个方法的
但是我们借助bulkCreate
看码!!:
await CompositionAnswer.bulkCreate(answerList, {
updateOnDuplicate: ['answer', 'updatedAt']
})
以上代码可以实现插入多个数据时,若其中有重复的数据,只对 answer和updatedAt进行更新。
那么关键来了,怎么判定数据重复,如果我不想使用表的默认主键(比如id),怎么办?
思考两秒分割线
答案就是 ,设置unique索引!!!
static options = {
indexes: [
{
name: 'composition_answer_index',
fields: [ 'exercise_id' ]
},
{
name: 'composition_answer_index_unique',
unique: true,
fields: ['exercise_id', 'question_id', 'question_material_id']
}
]
}
static init (sequelize) {
super.init({
sequelize,
attributes: this.attributes,
tableName: 'composition_answer',
options: this.options
})
}
composition_answer_index_unique 就是我们的唯一索引,当出现重复的数据时,不会进行插入,而是更新。
但是sequelize对于uniqueKeys设置有bug(目前最新版本6.2.3),只到上边那一步时,bulkCreate时还是没有识别到唯一索引。
hack方式就是,在attributes的字段,设置上 索引名称。
static attributes = {
exerciseId: {
unique: 'composition_answer_index_unique', //就是他!!!
type: DataTypes.INTEGER,
field: 'exercise_id'
},
questionId: {
unique: 'composition_answer_index_unique', // 和他!!!
type: DataTypes.INTEGER,
field: 'question_id'
},
questionMaterialId: {
unique: 'composition_answer_index_unique', // 还有他!!!
type: DataTypes.INTEGER,
field: 'question_material_id',
allowNull: true
}
}
现在bulkUpsert的功能已经实现了~~