用户结构体
type User struct {
gorm.Model
Name string
Age int
Birthday time.Time
Active bool
}
给原来的数据库添加字段
db.AutoMigrate(&User{})
保存所有字段
func update1() {
var user User
db.First(&user)
fmt.Printf("user: %v\n", user)
user.Name = "x王帆"
user.Active = true
db.Save(&user)
fmt.Printf("user: %v\n", user)
}
运行结果: 数据库数据如下:
更新单个列
条件更新
db.Model(&User{}).Where("active = ?", true).Update("Name", "hello")
运行后数据数据:
查出需要更新的
var user User
db.First(&user)
db.Model(&user).Update("name", "hello--wf")
根据条件和model的值进行更新
var user User
db.First(&user, 2)
db.Model(&user).Where("active = ?", true).Update("name", "hello-true")
数据库运行结果:(因为id为2的数据的active是false所以id为2的数据name没更新)
更新多列
根据struct更新属性,只会更新非零值得字段
var user User
db.First(&user)
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
注意观察 active没有变为false
根据map更新属性
var user User
db.First(&user)
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
注意观察active变为false了
更新选定字段
更新时候选定、忽略某些字段,可以使用select、omit
使用map进行select更新选择字段
var user User
db.First(&user)
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello-1", "age": 18, "active": false})
使用map进行omit更新忽略字段
var user User
db.First(&user)
db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello-1", "age": 180, "active": false})
使用 Struct 进行 Select(会 select 零值的字段)
var user User
db.First(&user)
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
db.Model(&user).Select("*").Omit("Role").Update(User{Name: "jinzhu", Role: "admin", Age: 0})
更新hook
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
fmt.Println("BeforeUpdate")
return
}
批量更新
根据struct更新
db.Model(User{}).Select("Name", "Age").Where("id IN ?", []int{5, 6}).Updates(User{Name: "hello", Age: 20})
根据map更新
db.Table("users").Where("id IN ?", []int{6, 7}).Updates(map[string]interface{}{"name": "hello1", "age": 19})
参考链接
https://gorm.io/zh_CN/docs/update.html
|