go语言Gin框架的学习路线(十一)

目录

GORM的CRUD教程

更新操作

更新所有字段

更新指定字段

使用 Select 和 Omit 更新

无 Hooks 更新

批量更新

删除操作

删除记录

批量删除

软删除

物理删除

示例代码

GORM的CRUD教程

CRUD 是 "Create, Read, Update, Delete"(创建、查询、更新、删除)的缩写,代表了数据库操作的基本功能。在 GORM 的上下文中,CRUD 指的是使用 GORM 库来执行这些基本的数据库操作。

更新操作

更新所有字段

使用 Save 方法可以更新对象的所有字段。

type User struct {gorm.ModelName stringAge  int
}func main() {db, err := gorm.Open(/* 连接数据库的参数 */)if err != nil {log.Fatal(err)}// 假设已经从数据库中获取了用户数据var user Userdb.First(&user, "id = ?", 1)// 更新用户信息user.Name = "Bob"user.Age = 25// 保存更新db.Save(&user)
}

这段代码是使用Go语言和GORM库来操作数据库的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它简化了与数据库的交互。

首先,定义了一个名为User的结构体,它包含了三个字段:gorm.ModelNameAgegorm.Model是GORM提供的一个基础模型,包含了一些通用的字段,如创建时间、更新时间和删除时间等。

接下来,在main函数中,首先尝试连接到数据库。这里省略了具体的连接参数,通常包括数据库类型、用户名、密码、主机地址和端口等信息。如果连接失败,程序将记录错误并退出。

然后,假设已经从数据库中获取了一个用户数据,将其存储在名为user的变量中。这里使用了db.First方法,它会根据给定的条件(这里是id = 1)查询数据库中的第一条记录,并将其赋值给user变量。

接下来,对user变量的属性进行了修改,将其Name属性设置为"Bob",Age属性设置为25。

最后,使用db.Save方法将更新后的user对象保存回数据库。这将触发数据库的更新操作,将对应记录的NameAge字段更新为新的值。

更新指定字段

使用 UpdateUpdates 方法可以更新指定字段。

// 更新单个字段
db.Model(&user).Update("age", 26)// 更新多个字段
db.Model(&user).Updates(User{Name: "Alice", Age: 30})
  1. db.Model(&user).Update("age", 26):这行代码表示更新名为user的对象的年龄字段为26。db.Model(&user)表示将要操作的对象设置为userUpdate("age", 26)表示将age字段的值更新为26。

  2. db.Model(&user).Updates(User{Name: "Alice", Age: 30}):这行代码表示更新名为user的对象的多个字段。db.Model(&user)表示将要操作的对象设置为userUpdates(User{Name: "Alice", Age: 30})表示将user对象的Name字段更新为"Alice",并将Age字段更新为30。

使用 Select 和 Omit 更新

使用 SelectOmit 可以控制更新哪些字段。

// 更新指定字段,忽略其他字段
db.Model(&user).Select("age").Omit("name").Update("age", 27)
  1. db.Model(&user):表示将要操作的对象设置为user
  2. Select("age"):表示只选择要更新的字段为age
  3. Omit("name"):表示忽略name字段,即不对该字段进行任何操作。
  4. Update("age", 27):表示将age字段的值更新为27。

综合起来,这段代码的作用是将名为user的对象的年龄字段更新为27,但不会更改其名字段的任何值。

无 Hooks 更新

使用 UpdateColumnUpdateColumns 方法可以进行无 Hooks 更新。

// 更新单个字段,不触发 Hooks
db.Model(&user).UpdateColumn("age", 28)// 更新多个字段,不触发 Hooks
db.Model(&user).UpdateColumns(User{Age: 29})

这段代码是使用Go语言的GORM库来更新数据库中的记录,同时避免触发相关的钩子(Hooks)。

  1. db.Model(&user).UpdateColumn("age", 28):这行代码表示更新名为user的对象的年龄字段为28。db.Model(&user)表示将要操作的对象设置为userUpdateColumn("age", 28)表示将age字段的值更新为28。与普通的Update方法不同,UpdateColumn不会触发任何关联的钩子函数。

  2. db.Model(&user).UpdateColumns(User{Age: 29}):这行代码表示更新名为user的对象的多个字段。db.Model(&user)表示将要操作的对象设置为userUpdateColumns(User{Age: 29})表示将user对象的Age字段更新为29。同样地,与普通的Updates方法不同,UpdateColumns不会触发任何关联的钩子函数。

通过使用UpdateColumnUpdateColumns方法,可以确保在更新数据时不会触发任何额外的钩子函数,这对于某些情况下需要更精确控制更新过程的场景非常有用。

 

批量更新

使用 SQL 表达式进行批量更新。

db.Table("users").Where("age > ?", 20).Update("age", gorm.Expr("age + 1"))

这段代码是使用Go语言的GORM库来更新数据库中的记录。

  1. db.Table("users"):表示将要操作的数据表为"users"。
  2. Where("age > ?", 20):表示筛选条件,只选择年龄大于20的用户。
  3. Update("age", gorm.Expr("age + 1")):表示将满足条件的用户的age字段的值加1。gorm.Expr用于构建表达式,这里使用了SQL表达式age + 1来实现自增操作。

综合起来,这段代码的作用是将名为"users"的数据表中年龄大于20的所有用户的年龄字段值加1。

删除操作

删除记录

使用 Delete 方法删除记录时,需要确保主键字段有值。

// 删除单个记录
db.Delete(&user, "id = ?", 1)// 删除多个记录
db.Delete(&User{}, "age > ?", 20)

这段代码是使用Go语言的GORM库来删除数据库中的记录。

  1. db.Delete(&user, "id = ?", 1):这行代码表示删除名为user的对象中,满足条件"id = 1"的记录。&user表示要操作的对象,"id = ?"是SQL语句的条件部分,1是条件的值。

  2. db.Delete(&User{}, "age > ?", 20):这行代码表示删除所有年龄大于20的用户记录。&User{}表示要操作的对象,这里使用了空结构体作为占位符,因为只需要指定表名和条件即可。"age > ?"是SQL语句的条件部分,20是条件的值。

 

批量删除

使用 Delete 方法可以删除多个记录。

db.Delete(&User{}, "age > ?", 20)

db.Delete(&User{}, "age > ?", 20):这行代码表示删除所有年龄大于20的用户记录。&User{}表示要操作的对象,这里使用了空结构体作为占位符,因为只需要指定表名和条件即可。"age > ?"是SQL语句的条件部分,20是条件的值。 

软删除

如果模型包含 DeletedAt 字段,GORM 会自动处理软删除。

// 软删除
db.Delete(&user, "id = ?", 1)// 查询未被软删除的记录
var users []User
db.Find(&users, "deleted_at IS NULL")

这段代码是使用Go语言的GORM库来操作数据库中的记录。

  1. db.Delete(&user, "id = ?", 1):这行代码表示删除ID为1的用户记录。&user表示要操作的对象,"id = ?"是SQL语句的条件部分,1是条件的值。这里的软删除是指将用户的deleted_at字段设置为当前时间,而不是直接从数据库中删除记录。

  2. var users []User:这行代码声明了一个名为users的切片,用于存储查询到的用户记录。

  3. db.Find(&users, "deleted_at IS NULL"):这行代码表示查询所有未被软删除的用户记录。&users表示要将查询结果存储到哪个变量中,"deleted_at IS NULL"是SQL语句的条件部分,表示只查询deleted_at字段为NULL(即未被软删除)的记录。

物理删除

如果需要进行物理删除,可以使用 Unscoped 方法。

// 物理删除
db.Unscoped().Delete(&user, "id = ?", 1)
  1. db.Unscoped():这个方法用于禁用软删除功能,使得后续的删除操作会直接从数据库中删除记录,而不是更新deleted_at字段。

  2. Delete(&user, "id = ?", 1):这行代码表示删除ID为1的用户记录。&user表示要操作的对象,"id = ?"是SQL语句的条件部分,1是条件的值。这里的物理删除是指直接从数据库中删除记录,而不是将其标记为已删除。

 

示例代码

以下是完整的示例代码,演示如何在 GORM 中实现 CRUD 操作中的 "Update" 和 "Delete" 功能。

package mainimport ("gorm.io/driver/sqlite""gorm.io/gorm""gorm.io/gorm/logger""log"
)type User struct {gorm.ModelName stringAge  int
}func main() {// 连接数据库db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{Logger: logger.Default.LogMode(logger.Info),})if err != nil {log.Fatal(err)}// 自动迁移模式db.AutoMigrate(&User{})// 创建记录user := User{Name: "Alice", Age: 30}db.Create(&user)// 更新记录user.Age = 31db.Save(&user)// 更新指定字段db.Model(&user).Update("age", 32)// 使用 Select 和 Omit 更新db.Model(&user).Select("age").Omit("name").Update("age", 33)// 无 Hooks 更新db.Model(&user).UpdateColumn("age", 34)// 批量更新db.Table("users").Where("age > ?", 20).Update("age", gorm.Expr("age + 1"))// 删除记录db.Delete(&user, "id = ?", user.ID)// 软删除db.Delete(&user, "id = ?", user.ID)// 物理删除db.Unscoped().Delete(&user, "id = ?", user.ID)
}

在这个示例中,我们首先连接到 SQLite 数据库,然后定义了一个 User 结构体,并进行了自动迁移。接着,我们创建、更新和删除了用户记录,并演示了如何进行软删除和物理删除。

期末放假自学Gin框架,希望我们可以一起学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486903.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Google Cloud Platform数据工程简介

Google Cloud Platform数据工程简介 前言 云计算的出现为数据驱动型组织提供了采用成本效益高且可扩展的数据工程解决方案的机会。在云服务提供商中,Google Cloud Platform (GCP) 是近年来表现优异的领导者之一。GCP的增长被归因于其在企业和初创公司中的日益普及…

【TypeScript 一点点教程】

文章目录 一、开发环境搭建二、基本类型2.1 类型声明2.2 基本类型 三、编译3.1 tsc命令3.2 tsconfig.json3.2.1 基本配置项includeexcludeextendsfiles 3.2.2 compilerOptions编译器的配置项 四、面向对象4.1 类4.2 继承4.3 抽象类4.4 接口 一、开发环境搭建 下载Node.js《Nod…

【全国大学生电子设计竞赛】2023年B题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~

IP数据报结构详解:从基础到进阶

目录 IP数据报的格式 IP数据报首部的固定部分 IP数据报首部的可变部分 实例分析:数据报的分片 生存时间(TTL)与协议 首部检验和 总结 在网络通信中,IP数据报是至关重要的基本单元。本文将带您深入了解IP数据报的格式及其各个…

Python酷库之旅-第三方库Pandas(041)

目录 一、用法精讲 136、pandas.Series.ne方法 136-1、语法 136-2、参数 136-3、功能 136-4、返回值 136-5、说明 136-6、用法 136-6-1、数据准备 136-6-2、代码示例 136-6-3、结果输出 137、pandas.Series.eq方法 137-1、语法 137-2、参数 137-3、功能 137-4、…

数据结构-C语言-排序(4)

代码位置: test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言: 1.1-排序定义: 排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序) 1.2-排…

如何借助生成式人工智能引领未来的科技狂潮

如何借助生成式人工智能引领未来的科技狂潮 1. 生成式AI的现状1.1 技术基础1.1.1 深度学习1.1.2 生成对抗网络(GANs)1.1.3 变分自编码器(VAEs) 1.2 主要应用1.2.1 语言模型1.2.2 图像生成1.2.3 音频与视频生成 2. 未来的发展趋势2…

Windows下帆软BI(finebi)单机部署移植(Tomcat)攻略

一、基础环境 操作系统:Windows 10 64bit 帆软BI 版本:V9.0/V10.0 HTTP工具:Tomcat 外置数据库:Oracle 11g 实验内容:将已经部署好的帆软BI从一台电脑移植到另一台电脑 二、前期准备 1、做好外置数据库移植&…

<数据集>苹果腐烂识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:978张 标注数量(xml文件个数):978 标注数量(txt文件个数):978 标注类别数:2 标注类别名称:[fresh_apple, rotten_apple] 序号类别名称图片数框数1fresh_apple520922…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块-B-4Web渗透测试

前言 本章节我将尝试操作B-4模块的渗透测试,搭建环境很难,还望大家点点赞多多支持! 任务概览 最后4、5、6有一定的难度。 环境要求 kali Linux192.168.41.2Web服务器(假设为PYsystem 2020 模拟平台)192.168.41.7交换…

日常开发记录分享——C#控件ToolTip实现分栏显示内容

文章目录 需求来源实现思路实施请看VCR等等别走,有优化 需求来源 需要在鼠标浮动到指定位置后提示出详细的信息,一开始使用的tooltip实现,但是里面的内容效果并不理想,需要有条理性,于是就想到能不能将展示的东西分列…

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术,可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用,只负责数据的路…

Linux(CentOS)的“应用商城” —— yum

Linux(CentOS)的“应用商城” —— yum 关于 yum 和软件包Linux 系统(CentOS)的生态yum 相关操作yum 本地配置yum 安装 lrzsz.x86_64 关于 yum 和软件包 首先 yum 是软件下载安装管理的客户端,类似各种手机里的“应用…

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…

【机器学习】Jupyter Notebook如何使用之基本步骤和进阶操作

引言 Jupyter Notebook 是一个交互式计算环境,它允许创建包含代码、文本和可视化内容的文档 文章目录 引言一、基本步骤1.1 启动 Jupyter Notebook1.2 使用 Jupyter Notebook 仪表板1.3 在笔记本中工作1.4 常用快捷键1.5 导出和分享笔记本 二、进阶用法2.1 组织笔…

“微软蓝屏”事件,给IT行业带来的宝贵经验和教训

“微软蓝屏”事件是指2024年7月19日发生的一次全球性技术故障,主要涉及微软视窗(Windows)操作系统及其相关应用和服务。 以下是对该事件的详细解析: 一、事件概述 发生时间:2024年7月19日事件影响:全球多个…

暑期c++ 命名空间

今天是暑期第一天开始写c笔记&#xff0c;新起点&#xff0c;新开始加油 我们先来看两串代码 这串代码编译没有问题 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int rand 14; int main(void) {int rand 14;printf("%d\n", rand);return 0; }但是…

鸽哒IM即时通讯安卓+苹果双系统源码20240723(反编译+二次开发版)

功能特点&#xff1a; 1、该软件支持加好友、消息私聊、消息群聊、朋友圈、红包、语音、视频、表情包&#xff0c;定位等。 2、此外&#xff0c;该软件还支持阅后即焚、消息过期自动销毁、支持3DES加密传输、支持端到端传输&#xff0c;保护消息隐私。 3、后台使用的是酷信的…

Java面试八股之详细阐述Spring的DI和IOC

详细阐述Spring的DI和IOC Spring框架的两大核心特性之一就是控制反转&#xff08;Inversion of Control, IoC&#xff09;&#xff0c;另一个密切相关的是依赖注入&#xff08;Dependency Injection, DI&#xff09;。这两个概念是Spring实现松耦合、可测试和可管理软件组件的…

JMeter:BeanShell到JSR223迁移中的注意事项

前言 在之前的文章JMeter&#xff1a;BeanShell向JSR223迁移过程遭遇的java标准库不可用问题-如何切换JDK版本中引用了一段使用BeanShell对入参进行加密的脚本&#xff0c;迁移到JSR223&#xff0c;虽然更换JDK后编译通过&#xff0c;看似也可以执行了&#xff0c;但是其实那段…