gorm基础05--CRUD 接口-更新

2023-11-13

gorm基础05--CRUD 接口-更新

介绍

上文 gorm基础04–CRUD 接口-查询 介绍了gorm 中常见查询方法,本文继续介绍gorm中常见的更新方法。具体包括 保存所有字段、更新单个列、更新多个列、更新选定字段、批量更新 等。

案例

updateAllFields(db) 保存所有字段
updateSingleField(db) 更新单个列
updateMultiFields(db) 更新多个列
updateSelectedFields(db) 更新选定字段
updateBatch(db) 批量更新
源码:

package main

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

type User struct {
	ID           uint
	Name         string
	Email        string
	Age          uint8
	Birthday     time.Time
	MemberNumber sql.NullString
	ActivatedAt  sql.NullTime
	CreatedAt    time.Time
	UpdatedAt    time.Time
	Active       bool
	Role         string
}

func getDb() *gorm.DB {
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       "root:111111@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
		DefaultStringSize:         256,                                                                          // string 类型字段的默认长度
		DisableDatetimePrecision:  true,                                                                         // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,                                                                         // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,                                                                         // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,                                                                        // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}})
	fmt.Printf("getDb db=%v, err=%v\n", db, err)
	return db
}

func updateAllFields(db *gorm.DB) {
	var user User
	db.First(&user)
	user.Name = "jinzhu 001"
	user.Age = 100
	db.Save(&user)
}

func updateSingleField(db *gorm.DB) {
	var user User
	// 条件更新
	db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
	// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

	// User 的 ID 是 `111`
	db.First(&user)
	db.Model(&user).Update("name", "hello02")
	// UPDATE users SET name='hello02', updated_at='2013-11-17 21:34:10' WHERE id=111;

	// 根据条件和 model 的值进行更新
	db.Model(&user).Where("active = ?", true).Update("age", 102)
	// UPDATE users SET age=100, updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
}

func updateMultiFields(db *gorm.DB) {
	var user User
	db.First(&user)
	// 根据 `struct` 更新属性,只会更新非零值的字段
	db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
	// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

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

func updateSelectedFields(db *gorm.DB) {
	var user1, user2, user3, user4, user5 User
	db.First(&user1)
	fmt.Println("user1=%v", user1)
	// 使用 Map 进行 Select
	// User's ID is `111`:
	db.Model(&user1).Select("name").Updates(map[string]interface{}{"id": user1.ID, "name": "hello01", "age": 18, "active": false})
	// UPDATE users SET name='hello' WHERE id=111;

	db.Find(&user2, 2)
	fmt.Println("user2=%v", user2)
	db.Model(&user2).Omit("active").Updates(map[string]interface{}{"id": 2, "name": "hello02", "age": 18, "active": false})
	// UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

	// 使用 Struct 进行 Select(会 select 零值的字段)
	db.Find(&user3, 3)
	fmt.Println("user3=%v", user3)
	db.Model(&user3).Select("Name", "Age").Updates(User{ID: user3.ID, Name: "hello03", Age: 0})
	// UPDATE users SET name='hello03', age=0 WHERE id=111;

	// Select 所有字段(查询包括零值字段的所有字段)
	db.Find(&user4, 4)
	fmt.Println("user4=%v", user4)
	db.Model(&user4).Select("*").Updates(User{ID: user4.ID, Name: "jinzhu04", Role: "admin", Age: 0, Birthday: time.Now(), CreatedAt: user4.CreatedAt})

	// Select 除 Role 外的所有字段(包括零值字段的所有字段)
	db.Find(&user5, 5)
	fmt.Println("user5=%v", user5)
	db.Model(&user5).Select("*").Omit("Role").Updates(User{ID: user5.ID, Name: "jinzhu05", Role: "admin", Age: 0, Birthday: time.Now(), CreatedAt: user5.CreatedAt})
}

func updateBatch(db *gorm.DB) {
	// 根据 struct 更新
	db.Model(User{}).Where("role = ?", "admin").Updates(User{Name: "hello", Age: 18})
	// UPDATE users SET name='hello', age=18 WHERE role = 'admin';

	// 根据 map 更新
	db.Table("user").Where("id IN ?", []int{10, 11}).Updates(map[string]interface{}{"name": "hello", "age": 18})
	// UPDATE users SET name='hello', age=18 WHERE id IN (10, 11);
}

func main() {
	db := getDb()
	db.AutoMigrate(User{})
	//updateAllFields(db)
	//updateSingleField(db)
	//updateMultiFields(db)
	//updateSelectedFields(db)
	updateBatch(db)
}

测试:
保存所有字段
在这里插入图片描述
更新单个列
在这里插入图片描述
更新多个列
在这里插入图片描述
更新选定字段
在这里插入图片描述
批量更新
在这里插入图片描述

说明

gorm官方文档 CRUD 接口-更新

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gorm基础05--CRUD 接口-更新 的相关文章

  • golang-bufio 缓冲扫描

    前面两篇博客 介绍了 bufio 包中的缓冲读和写 bufio go 下面再来介绍一下缓冲扫描 scan go 这个扫描的是用来对缓存读的更高级封装 提供了一些更易用的方法 缓冲扫描 Scanner 提供了一个方便的接口来读取数据 例如使用
  • go踩坑——no required module provides package go.mod file not found in current directory or any parent

    背景 准备运行下面代码 package main import github com gin gonic gin func main 创建一个默认的路由引擎 r gin Default GET 请求方式 hello 请求的路径 当客户端以G
  • Go Web编程实战(6)----反射

    目录 反射 反射的3大原则 接口类型变量 转换为 反射类型对象 反射类型对象 转换为 接口类型变量 反射类型对象 修改 值必 可写的 反射 与其他语言一样 Go语言的反射同样是指 计算机程序在运行时 可以访问 检测和修改它本身状态或行为的一
  • Go项目部署及所遇问题

    小聊 本次小白给大家带来Golang项目部署操作以及个人所遇问题和解决它们的方法 依然是一边实操演示一边写文稿 如遇相似问题却存有疑惑可留言 开发环境是Window 部署环境是Linux 开发工具为GoLand 部署服务器为阿里云 1 打包
  • Go语言入门【09】结构体

    结构体 相比于Java 在Go语言中没有类的概念 但是多了结构体 结构体与Java中的类很像 是表示一系列同一类型或不同类型的数据构成的数据集合 例如可以将学生抽象成一个结构体 每一个学生有以下属性 Name 姓名 Age 年龄 Gende
  • Go切片排序

    Go 语言标准库提供了sort包 用于对切片和用户定义的集合进行排序 具体示例如下 基本排序 package main import fmt sort func main float 从小到大排序 f float64 5 2 1 3 0 7
  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • golang:环境变量GOPROXY和GO111MODULE设置

    我们安装完golang后 我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了 同样的在linux下可以在控制台使用 如下图所示 C Users lijie1 gt go env set GO111MODULE set
  • Golang连接Jenkins获取Job Build状态及相关信息

    文章目录 1 连接Jenkins 2 controller 3 module 4 router 5 效果展示 第三方包 gojenkins 方法文档 gojenkins docs 实现起来很简单 利用第三方库 连接jenkins 调用相关方
  • go 进阶 go-zero相关: 七. 拦截器与熔断拦截器

    目录 一 拦截器的基础使用 1 服务端拦截器 2 客户端拦截器 二 拦截器底层底层执行原理 三 go zero默认添加的拦截器 客户端 1 熔断器拦截器 BreakerInterceptor 服务端 一 拦截器的基础使用 在go zero
  • Go语言里面的各种疑难杂症

    什么是闭包 闭包有什么缺陷 func AddUpper func int int var n int 10 return func x int int n n x return n func main f AddUpper fmt Prin
  • Go 语言输出文本函数详解

    Go语言拥有三个用于输出文本的函数 Print Println Printf Print 函数以其默认格式打印其参数 示例 打印 i 和 j 的值 package main import fmt func main var i j stri
  • Go 程序编译过程(基于 Go1.21)

    版本说明 Go 1 21 官方文档 Go 语言官方文档详细阐述了 Go 语言编译器的具体执行过程 Go1 21 版本可以看这个 https github com golang go tree release branch go1 21 sr
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d
  • go-zero开发入门之网关往rpc服务传递数据2

    go zero 的网关服务实际是个 go zero 的 API 服务 也就是一个 http 服务 或者说 rest 服务 http 转 grpc 使用了开源的 grpcurl 库 当网关需要往 rpc 服务传递额外的数据 比如鉴权数据的时候
  • go-zero开发入门-API网关开发示例

    开发一个 API 网关 代理 https blog csdn net Aquester article details 134856271 中的 RPC 服务 网关完整源代码 file main go package main import
  • go-zero开发入门之gateway深入研究1

    创建一个 gateway 示例 main go package main import flag fmt gateway middleware github com zeromicro go zero core conf github co
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • go语言实现文件夹上传前后端代码案例

    go语言实现文件夹上传前后端代码案例 前端用于上传的测试界面 如果上传的文件夹有子文件要遍历子文件夹创建出子文件夹再进行拷贝 需要获取文件名和对应的路径 将文件的相对路径和文件对象添加到FormData中 这几行代码很关键 for let
  • go cannot find package “github.com/gorilla/websocket“解读

    Go无法找到包 github com gorilla websocket 的解决方案 在Go开发过程中 我们经常会依赖第三方库来简化开发工作 而使用 go get 命令安装这些库时 有时候我们可能会遇到类似于以下错误的情况 plaintex

随机推荐

  • 鲁棒优化入门(二)——基于matlab+yalmip求解鲁棒优化问题

    上一篇博客简单介绍了可以用来求解鲁棒优化的两个工具箱 鲁棒优化入门 一 工具箱Xprog和RSOME的安装与使用 其实大家可能没有想过 matlab yalmip工具箱也可以处理一些简单的鲁棒优化问题 上官方文档 Robust optimi
  • 计算机毕业设计,这6个网站早知道,太牛了

    作为一个计算机专业毕业的学长 好多人都问过我 大四毕业设计有什么推荐的资料吗 在这里 程序员我 我汇总一下 一起发出来 希望给计算机专业毕业的你们提供些帮助 论文 中国知网 中国知网作为是国内毕业生常用的毕业论文检索平台 不仅有学术文献 外
  • [Python从零到壹] 六十.图像识别及经典案例篇之基于阈值及边缘检测的图像分割

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • 途牛原创|无线中心运营研发Redis酷实践

    Redis 简介 Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 并提供多种语言的API 从2010年3月15日起 Redis的开发工作由VMware主持 从2013年5月开
  • 你不会还没用过这款接口管理工具吧?

    以前在公号发布的文章 现共享出来哈 哈喽 大家好 我是源小北 作为一个合格码农 总得认识那么一两款接口管理工具吧 其实各类工具都有n个兄弟姐妹 大家能实现的功能都差不多 但迭代更新 主流有它成为主流的原因 就好像我以前也用了好几款编译器 可
  • Java 根据Cron表达式获取近几次任务执行时间

    这篇博客将介绍Java 如何根据Cron表达式获取近几次任务执行时间 实际上使用 quartz 包 CronSequenceGenerator 以及TriggerUtils computeFireTimes 俩种方法进行时间获取 1 效果图
  • 【Hadoop】HDFS概述

    文章目录 前言 一 HDFS 的定义 二 HDFS 的优点 三 HDFS 的缺点 四 HDFS 的组成架构 五 HDFS 的文件块大小 前言 随着数据量越来越大 在一个操作系统存不下所有的数据 那么就分配到更多的操作系统管理的磁盘中 但是不
  • 不要二-网易python(找数据逻辑)

    题目描述 二货小易有一个W H的网格盒子 网格的行编号为0 H 1 网格的列编号为0 W 1 每个格子至多可以放一块蛋糕 任意两块蛋糕的欧几里得距离不能等于2 对于两个格子坐标 x1 y1 x2 y2 的欧几里得距离为 x1 x2 x1 x
  • 如何将项目上传到Gitee上

    一 首先保证本机已经安装了Git git官网安装完成之后 鼠标右键会出现Git GUI Here和Git Bash Here 二 上传代码到码云 核心 总共有7个步骤 1 首先要注册Gitee账号 并且新建一个仓库来存放项目文件 2 在本地
  • 使用Unity2018 自带高通AR组件(Vuforia)—— 创建Virtual Button

    之前翻译了一篇使用unity2017自带高通AR组件 Vuforia 的文章 昨天有位Bro问了一下怎么使用内置组件创建虚拟按钮 Virtual Button 在这里简单的叙述一下 一方面是回答那位Bro 另一方面是作为积累以防后续用到时忘
  • linux dev vda1占用磁盘,centos 磁盘清理 /dev/vda1系统盘满了

    df h 检查一台服务器磁盘使用空间 发现磁盘已经使用了100 思路是 1 cd usr 当然这里不一定是 usr目录 最好是cd到 根目录再执行下一步 2 du sh 看哪个目录占用空间大 3 重复前两步 根据实际情况删除或者移走 4 日
  • VirtualBox 共享文件夹设置

    在ubuntu中执行 mkdir share dir 新建文件夹 然后挂载 sudo mount t vboxsf share share dir 就可以把windows中的E share文件夹挂在为ubuntu中的share dir文件夹
  • MySql基础复习

    数据库的基本操作 如何创建数据库 数据库的删除操作 存储引擎的了解及其工作原理和如何选择 1 创建数据库 创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理 mysql安装完成以后 将会在其data目录下自动创建几个必须的数据库 可以
  • canvas学习笔记(详细)

    Canvas 一 Canvas基础知识 1 画布 画布是H5中一个重要的概念 它面向开发人员提供了非常底层的绘图接口 使得绘制速度可以大幅提高 2 canvas元素 canvas 标签只有两个属性 width和height 这些都是可选的
  • 晶振工作原理及参数详解(最透彻)

    原文链接点击这里 晶振是石英晶体谐振器 quartz crystal oscillator 的简称 也称有源晶振 它能够产生中央处理器 CPU 执行指令所必须的时钟频率信号 CPU一切指令的执行都是建立在这个基础上的 时钟信号频率越高 通常
  • 系统概要设计说明书_「软件项目管理入门」(23) 如何做好概要设计?

    实际上需求分析是一个很复杂的也是很重要的环节 如果要完整的阐述 三言两语肯定不够 好在我这个系列只是和大家分享一些心得 这里就适可而止了 以后有机会再和大家共同探讨这方面的问题 需求分析的输出主要针对乙方 但需要甲方确认 所以很多人误以为甲
  • mysql规范总结

    参考文献 https www cnblogs com qlqwjy p 8425861 html https blog csdn net u010498753 article details 85966709 一 基本规范要求 1 没有特殊
  • Python字典中8个常见内置函数,一次性给你总结

    字典是Python中很重要的数据类型 我们在日后的学习中 会经常遇到 因此 有8个常用的内置函数 我觉得你一定需要知道 d clear 含义 清除字典 d a 10 b 20 c 30 gt gt gt d a 10 b 20 c 30 g
  • Proability and Bayes’ NET

    Probabilistic Inference compute a desired probabilities from others known probabilities 我们通常计算条件概率 each possible state f
  • gorm基础05--CRUD 接口-更新

    gorm基础05 CRUD 接口 更新 介绍 案例 说明 介绍 上文 gorm基础04 CRUD 接口 查询 介绍了gorm 中常见查询方法 本文继续介绍gorm中常见的更新方法 具体包括 保存所有字段 更新单个列 更新多个列 更新选定字段