美文网首页
sequelize实现bulk upsert

sequelize实现bulk upsert

作者: last_edc | 来源:发表于2020-07-02 19:33 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/lffdqktx.html