这篇文章我们主要讲解如何使用gorm更新数据。
- save更新
- 采用update更新单个字段
- 采用updates更新多个字段
- 采用struct的方式更新
- 采用map的方式更新
- 采用select选取更新的字段
- 采用UpdateColumn选择需要更新的字段
更新所有字段
package main
import (
"ginLearn.com/models"
)
func main() {
db := models.DB()
user := models.User{}
user.Name = "hanyun"
db.Where(&user).Find(&user)
db.Save(&user)
}
如果查到数据
SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL AND ((`users`.`name` = 'hanyun'))
UPDATE `users` SET `created_at` = '2020-03-18 10:20:08', `updated_at` = '2020-03-18 10:20:14', `deleted_at` = NULL, `name` = 'hanyun', `age` = 0 WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 10
如果没有查到数据
SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL AND ((`users`.`name` = 'hanyun'))
INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`age`) VALUES ('2020-03-18 10:24:25','2020-03-18 10:24:25',NULL,'hanyun',0)
执行两次我们发现,我调用了查找再执行save,如果没数据就执行插入,有就执行更新,而且save方法更新所有的字段。
package main
import (
"ginLearn.com/models"
"github.com/jinzhu/gorm"
)
func main() {
db := models.DB()
user := models.User{}
user.Name = "hanyun"
db.Where(&user).Find(&user)
db.Save(&user)
//更新指定字段Update
// UPDATE `users` SET `name` = 'hahahaha', `updated_at` = '2020-03-18 10:28:08' WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 11
db.Model(&user).Update("name", "hahahaha")
//更新指定多个字段Update
//采用map传递参数
// UPDATE `users` SET `age` = 1, `name` = 'hanyun', `updated_at` = '2020-03-18 10:32:28' WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 12
db.Model(&user).Updates(map[string]interface{}{"name": "hanyun", "age": 1})
//采用struct传递参数
//UPDATE `users` SET `age` = 12, `name` = 'hanyun', `updated_at` = '2020-03-18 10:32:28' WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 12
db.Model(&user).Updates(models.User{Name: "hanyun", Age: 12})
//更新选定字段
//UPDATE `users` SET `name` = 'hanyun', `updated_at` = '2020-03-18 10:34:02' WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 12
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hanyun", "age": 1})
//批量更新
//UPDATE `users` SET `name` = 'hanyun', `updated_at` = '2020-03-18 10:35:34' WHERE `users`.`deleted_at` IS NULL AND ((`users`.`id` IN (1)))
db.Model(&models.User{}).Where([]int{1}).Select("name").Updates(map[string]interface{}{"name": "hanyun", "age": 1})
//使用 SQL 表达式更新
//这里我们对age进行的+1操作
//UPDATE `users` SET `age` = age+1, `updated_at` = '2020-03-18 10:38:58' WHERE `users`.`deleted_at` IS NULL
db.Model(&models.User{}).Updates(map[string]interface{}{"age": gorm.Expr("age+?", 1)})
//无 Hooks 更新 UpdateColumn ,这个不会更新 UpdatedAt 字段
//UPDATE `users` SET `age` = age+1 WHERE `users`.`deleted_at` IS NULL 比较 Updates的更新SQL
db.Model(&models.User{}).UpdateColumn(map[string]interface{}{"age": gorm.Expr("age+?", 1)})
//UPDATE `users` SET `age` = age+1, `name` = 'hhhhhhhh' WHERE `users`.`deleted_at` IS NULL
db.Model(&models.User{}).UpdateColumns(map[string]interface{}{"age": gorm.Expr("age+?", 1),"name":"hhhhhhhh"})
}
这里需要特别强调的一点是我们采用UpdateColumns更新的时候,UpdatedAt 字段不会更新

链接:pan.baidu.com/s/1kN8gI3Ma… 提取码:8suh 复制这段内容后打开百度网盘手机App,操作更方便哦
