gorm之CURD-更新篇

2,374 阅读2分钟

这篇文章我们主要讲解如何使用gorm更新数据。

  1. save更新
  2. 采用update更新单个字段
  3. 采用updates更新多个字段
  4. 采用struct的方式更新
  5. 采用map的方式更新
  6. 采用select选取更新的字段
  7. 采用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,操作更方便哦