sequelize是沒有支持 bulkUpsert這個方法的
但是我們借助bulkCreate
看碼U豕臁E浊蕖:
await CompositionAnswer.bulkCreate(answerList, {
updateOnDuplicate: ['answer', 'updatedAt']
})
以上代碼可以實現(xiàn)插入多個數(shù)據(jù)時涨颜,若其中有重復(fù)的數(shù)據(jù)项滑,只對 answer和updatedAt進行更新依沮。
那么關(guān)鍵來了,怎么判定數(shù)據(jù)重復(fù)枪狂,如果我不想使用表的默認(rèn)主鍵(比如id)危喉,怎么辦?
思考兩秒分割線
答案就是 州疾,設(shè)置unique索引9枷蕖!严蓖!
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 就是我們的唯一索引薄嫡,當(dāng)出現(xiàn)重復(fù)的數(shù)據(jù)時,不會進行插入谈飒,而是更新岂座。
但是sequelize對于uniqueKeys設(shè)置有bug(目前最新版本6.2.3),只到上邊那一步時杭措,bulkCreate時還是沒有識別到唯一索引费什。
hack方式就是,在attributes的字段,設(shè)置上 索引名稱鸳址。
static attributes = {
exerciseId: {
unique: 'composition_answer_index_unique', //就是他4耱健!稿黍!
type: DataTypes.INTEGER,
field: 'exercise_id'
},
questionId: {
unique: 'composition_answer_index_unique', // 和他U钍荨!巡球!
type: DataTypes.INTEGER,
field: 'question_id'
},
questionMaterialId: {
unique: 'composition_answer_index_unique', // 還有他Q糟濉!酣栈!
type: DataTypes.INTEGER,
field: 'question_material_id',
allowNull: true
}
}
現(xiàn)在bulkUpsert的功能已經(jīng)實現(xiàn)了~~