golang gorm mysql ON DUPLICATE KEY UPDATE

gorm 是一個在 go 語言裡面相當受歡迎的 orm library

在實際使用上,我們很常會有找得到資料更新,找不到資料就寫入資料的需求

翻閱文件的時候會發現 Assign 這一段(link),就是我們要的

文件上面也明確得讓你知道 會下兩次 SQL Query 來解決問題

可是本質上就是 Mysql 語法裡面的 ON DUPLICATE KEY UPDATE

若是想要使用ㄏ減少 ON DUPLICATE KEY UPDATE 來減少 Query 次數

Extra Creating option 這一段(link),就是我們要的

文件上寫的不是很清楚(個人認為)

以下用 Code 來解釋 (讓 code 自表述)

Model


    type TestModel struct {
        ID        uint       `gorm:"primary_key;index"`
        Name      string     `gorm:"unique_index;not null;type:varchar(40)"`
        Value     string     `gorm:"type:text;"`
        CreatedAt time.Time  `gorm:"not null"`
        UpdatedAt time.Time  `gorm:"not null"`
        DeletedAt *time.Time `gorm:"index"`
    }


使用 Assign

func FindItUpdateElseInsert(key string, value string) error {

	now := time.Now()

	find := TestModel{Name: key}
	update := TestModel{Value: value, UpdatedAt: now}
	insert := TestModel{Name: key, Value: value, CreatedAt: now, UpdatedAt: now}

    return db.Where(find).Assign(update).FirstOrCreate(&insert).Error
    
}


使用 Extra Creating option


    func OnDuplicateUpdate(key string, value string) error {
        now := time.Now()
        model := TestModel{Name: key, Value: value, CreatedAt: now, UpdatedAt: now}
        return db.Set(
            "gorm:insert_option",
            "ON DUPLICATE KEY UPDATE value = VALUES(value), updated_at = Values(updated_at)",
        ).Create(&model).Error
    }


兩個的差別在於

Assign 會下兩次 query

Extra Creating option 只會下一次

優劣 就端看個人怎樣取捨了


Gorm Github


打完收工