比如插入 f_create_uid,更新时忽略 f_create_uid,只更新 f_update_uid。可使用 gorm 的 BeforeCreate 和 BeforeUpdate 钩子,这两个钩子分别在创建和更新记录之前被调用。
// BeforeCreate 在创建记录之前调用
func (dob *MyStruct) BeforeCreate(tx *gorm.DB) (err error) {
dob.CreateUid = // 设置创建人id
dob.UpdateUid = // 设置更新人id
return
}
// BeforeUpdate 在更新记录之前调用
func (dob *MyStruct) BeforeUpdate(tx *gorm.DB) (err error) {
dob.UpdateUid = // 设置更新人id
return
}
注册和应用钩子:
// 注册钩子
db.Callback().Create().Before("gorm:create").Register("before_create", func(db *gorm.DB) {
if dob, ok := db.Statement.Dest.(MyStruct); ok {
dob.BeforeCreate(db)
}
})
db.Callback().Update().Before("gorm:update").Register("before_update", func(db *gorm.DB) {
if dob, ok := db.Statement.Dest.(MyStruct); ok {
dob.BeforeUpdate(db)
}
})
// 批量插入或更新(在冲突时更新除主键以外的所有列到新值)
db := tx.Model(&MyStruct{})
db = db.Omit("f_id", "f_update_time", "f_create_time", "f_memo")
db = db.Clauses(clause.OnConflict{UpdateAll: true})
err := db.Create(me).Error
if err != nil {
fmt.Printf("InsertOrUpdate error: %s", err.Error())
return nil, err
}
取消注册的钩子:
// 取消注册 BeforeCreate 钩子
db.Callback().Create().Before("gorm:create").Unregister("before_create")
// 取消注册 BeforeUpdate 钩子
db.Callback().Update().Before("gorm:update").Unregister("before_update")
标签:INSERT,...,dob,钩子,INTO,db,update,create,gorm
From: https://www.cnblogs.com/aquester/p/18194787