Golang中如何仅保存差异部分

Golang中如何仅保存差异部分 我有一个函数,它创建类似这样的记录:

func A(db *gorm.DB, b []C) error {
	d := []e{}
	for _, f := range b {
		d = append(d, g(f))
	}
	return db.Save(&d).Error
}

我希望能够上传一些数据(这些数据可能相同),但只希望保存有差异的部分。

因此,如果我上传相同的数据,我希望这个过程能顺利进行,因为没有差异(或更改)。

如果我尝试上传相同的数据,我会得到:"error":"Error 1062: Duplicate entry '1' for key ... 但如前所述,我不希望这种情况发生。我希望上传时没有任何错误。 我也尝试了类似 Upsert / On Conflict 的操作,但没有成功(Create | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

谢谢!


更多关于Golang中如何仅保存差异部分的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何仅保存差异部分的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要实现只保存差异部分并避免重复键错误,可以使用GORM的Clauses(clause.OnConflict{DoNothing: true})。这会忽略冲突,只插入新记录。

示例代码:

import (
    "gorm.io/gorm"
    "gorm.io/gorm/clause"
)

func A(db *gorm.DB, b []C) error {
    d := []e{}
    for _, f := range b {
        d = append(d, g(f))
    }
    
    // 使用OnConflict DoNothing忽略重复键错误
    return db.Clauses(clause.OnConflict{DoNothing: true}).Create(&d).Error
}

如果需要更新部分字段而不是完全忽略,可以指定更新字段:

// 冲突时更新指定字段
return db.Clauses(clause.OnConflict{
    Columns:   []clause.Column{{Name: "id"}}, // 冲突检测列
    DoUpdates: clause.AssignmentColumns([]string{"name", "updated_at"}), // 更新字段
}).Create(&d).Error

如果希望使用所有字段进行冲突检测(包括唯一索引):

// 使用所有字段检测冲突
return db.Clauses(clause.OnConflict{
    UpdateAll: true,
}).Create(&d).Error

注意:确保你的模型定义了正确的唯一约束或主键,GORM才能正确检测冲突。

回到顶部