修改

01 普通用法

  • 修改全部字段

DB.sava(&book)

package mian

func main(){
	var book Book
	DB.Where("id=?", 1).First(&book)
  book.Name := "name"
  book.Message := "is cool" 
  book.Price := 0  // 是零值,也会被修改
	DB.Save(&book)
  fmt.Println(book)
}

注意:

​ 零值也会被修改

  • 指定字段字段修改

Update方法,必须指定条件

package mian

func main(){
	var book Book
	DB.Where("id=?", 1).First(&book)
  book.Name := "name"
  book.Message := "is cool"  
  book.Price := 0 // 是零值不会被修改
	DB.Model(&book).Where("id=?", id).Update("name", name, "message", message, "price", priceInt) // 可以跟多个要修改的数据
  fmt.Println(book)
}

注意:

​ 零值不会被修改

​ 必须要有Model

update参数类型可以是:structmap

Select() Omit()

// Select 和 Map
// User's ID is `111`:
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
// UPDATE users SET name='hello' WHERE id=111;

db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
// UPDATE users SET age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

// Select 和 Struct (可以选中更新零值字段)
db.Model(&result).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;

02 钩子函数

在特定条件下,自动触发

BeforeSaveBeforeUpdateAfterSaveAfterUpdate

func (u *Book) BeforeUpdate(tx *gorm.DB) (err error) { // 在更新book表数据之前
    if u.Role == "admin" {
        return errors.New("admin user not allowed to update")
    }
    return
}
posted @ 2021-03-15 10:39  tianzhh_lynn  阅读(35)  评论(0编辑  收藏  举报