sequelize实现bulk upsert

sequelize是没有支持 bulkUpsert这个方法的
但是我们借助bulkCreate
看码!!:

await CompositionAnswer.bulkCreate(answerList, {
  updateOnDuplicate: ['answer', 'updatedAt']
})

以上代码可以实现插入多个数据时,若其中有重复的数据,只对 answerupdatedAt进行更新。

那么关键来了,怎么判定数据重复,如果我不想使用表的默认主键(比如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的功能已经实现了~~

你可能感兴趣的:(sequelize实现bulk upsert)