gorm更新指定的字段
gorm更新选定字段,经过一系列的测试,终于搞懂了,觉得不注意还是很容易掉进坑里的
Save 会保存所有的字段,即使字段是零值,但如果保存值不包含主键,它将执行Create, db.First(&user) user.Name = "jinzhu 2" user.Age = 100 db.Save(&user) // UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111; 保存是一个组合功能。如果保存值不包含主键,它将执行Create,否则它将执行Update(使用所有字段),如果用save 必须传入主键,否则就会新增数据。 如果使用save更新,必须先查询或者传入的值包含所有的字段,切勿传入单个字段更新,那样update里面没有更新的字段值会被清空 Updates Updates支持使用struct或map[string]interface{}进行更新,当使用struct进行更新时,默认情况下只更新非零字段,如果struct更新非0字段,必须加上select或者将该字段设置为指针 // Select with Map // User's ID is `111`: db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false}) // UPDATE users SET name='hello' WHERE id=111; db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false}) // UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111; // Select with Struct (select zero value fields) select + struct更新, 会更新零值的字段 db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0}) // UPDATE users SET name='new_name', age=0 WHERE id=111; // Omit + struct更新, 不会更新零值的字段 Age=0不会执行 db.Debug().Model(&User{}).Where(map[string]interface{}{"id": 7}).Omit("name").Updates(User{ Name: sql.NullString{"struct2", true}, Age: 0, }) // 此语句不执行 // Select("*")会更新所有字段,但update里面没有更新的字段值会被清空 db.Model(&user).Select("*").Updates(User{Name: "jinzhu", Role: "admin", Age: 0}) // Select all fields but omit Role (select all fields include zero value fields) db.Model(&user).Select("*").Omit("Role").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})