Go --- gorm 简单的增删操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Go --- gorm 简单的增删操作

Gorm是什么

Gorm是一个Golang ORM库

其中:

ORM(object/Relation Mapping),对象/关系映射,关系型数据库映射成对象,是一种为了帮助程序员用面对对象的思想来操作数据库为目的而被设计的。

简单使用

这里说一下,gorm有两种导入方式

“github.com/jinzhu/gorm”

“gorm.io/gorm”

两个包都是gorm,只是版本不同,所以有些方法也不同,这里使用的"gorm.io/gorm"这个包

连接数据库

连接数据库,这里以mysql为例

// 导入
// "gorm.io/driver/mysql"
// "gorm.io/gorm"
// gorm.Open(mysql.Open(dsn), &gorm.Config{})
db, err := gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
        utils.DatabaseSetting.User,
        utils.DatabaseSetting.Password,
        utils.DatabaseSetting.Host,
        utils.DatabaseSetting.Name)),
        &gorm.Config{
})
if err != nil {
        fmt.Println("\n",err)
        fmt.Println("连接数据库失败")
}

配置数据库连接池

// 设置数据库连接池
// GORM 使用 database/sql 维护连接池
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)


注册模型

gorm官方定义的model

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

写一个嵌套着官方模型的model

// User 简单的用户模型
type User struct {
  gorm.Model
  Username string `json:"username"`
  Password string `json:"password"`
}

注册模型

// 注册模型
err = db.AutoMigrate(&models.User{})
if err != nil {
    fmt.Println(err)
    fmt.Println("注册模型失败")
}

CRUD

不演示原生SQL和SQL生成器

特别注意:gorm中的条件会遗传给下一个SQL语句

1.根据结构体传值插入

// 第一种 根据结构体传值插入
u := models.User{Username: "张三", Password: "123"}
create := db.Create(&u)
 用户id
id := u.ID
fmt.Println("用户id =",id)
 返回错误信息
err = create.Error
if err != nil {
  fmt.Println(err)
  fmt.Println("插入信息出错")
}

2.根据给定字段插入

// 第二种 根据给定字段插入
// 1.创建记录并更新给出的字段。
db.Select("UserName").Create(&models.User{Username: "张三",Password: "123"})
// INSERT INTO `users` (`UserName`) VALUES ("张三")
// 2.创建一个记录且一同忽略传递给略去的字段值。
db.Omit("Password").Create(&models.User{Username: "张三",Password: "123"})
// INSERT INTO `users` (`UserName`,`updated_at`,`created_at`) VALUES ("张三","2022-03-05 00:00:00.000", "2022-03-05 00:00:00.000")

3.批量插入

// 第三种 批量插入
var users = []models.User{{Username: "张三"}, {Username: "李四"}, {Username: "王五"}}
db.Create(&users)
for i, user := range users {
  id := user.ID
  fmt.Println("用户",i,"的id =",id)
}

或者 分批创建并指定每批数量

// 或者 分批创建并指定每批数量
var users = []models.User{{Username: "张三"}, ...., {Username: "李四"}}
// 设定每批数量为 100
db.CreateInBatches(users, 100)

简单查询

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 随机查询一条数据
result := db.Limit(1).Find(&user)
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

根据主键查询

// 根据主键查询(主键是数字类型)
db.First(&user,1)
// SELECT * FROM users WHERE id = 1;
db.First(&user,"1")
// SELECT * FROM users WHERE id = 1;
// 根据主键查询(主键是string类型,就像uuid)
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";

批量查询

// 查询给定信息的数据
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
// 查询所有数据
result := db.Find(&users)
// 查询的条数
count := result.RowsAffected
fmt.Println("共有",count,"条数据")

条件查询

// 条件查询
db.Where("name = ?", "张三").First(&user)
// SELECT * FROM users WHERE name = '张三' ORDER BY id LIMIT 1;
// 获取所有满足条件的信息
db.Where("name <> ?", "张三").Find(&users)
// SELECT * FROM users WHERE name <> '张三';
// 也可以根据结构体实现条件查询
db.Where(&models.User{Username: "张三",Password: "123"}).First(&user)
// SELECT * FROM users WHERE username = "张三" AND password = "123" ORDER BY id LIMIT 1;
// 内联条件
db.Find(&user, "username = ?", "张三")
// SELECT * FROM users WHERE username = "张三";
db.Find(&users, "username <> ?", "张三")
// SELECT * FROM users WHERE username <> "张三";

更改单列

user.ID = 1
db.Model(&user).Update("username", "加油吧")
// UPDATE users SET username='加油吧', updated_at='2022-3-6 21:34:10' WHERE id=1;

条件更改

db.Model(&models.User{}).Where("username = ?", "张三").Update("username", "努力吧")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

批量更改

// 根据 struct 更新
db.Model(models.User{}).Where("username = ?", "张三").Updates(models.User{Username: "罗翔", Password: "abc"})
// UPDATE users SET username='罗翔', Password='abc' WHERE username = '张三';


使用 struct 删除时,需要该 struct 有主键,不然会批量删除

user.ID = 1
db.Delete(&user)
// DELETE from users where id = 1;

根据主键删除

db.Delete(&models.User{},2)
db.Delete(&models.User{},"3")

批量删除

db.Where("username LIKE ?", "%罗%").Delete(&models.User{})
// DELETE from emails where username LIKE "%罗%";


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
go 通过sql操作mysql
go 通过sql操作mysql
30 1
|
3月前
|
SQL JSON Go
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
57 3
|
5月前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
6月前
|
存储 安全 编译器
go语言中进行不安全的类型操作
【5月更文挑战第10天】Go语言中的`unsafe`包提供了一种不安全但强大的方式来处理类型转换和底层内存操作。包含两个文档用途的类型和八个函数,本文也比较了不同变量和结构体的大小与对齐系数,强调了字段顺序对内存分配的影响。
124 8
go语言中进行不安全的类型操作
|
4月前
|
分布式计算 大数据 Go
MaxCompute操作报错合集之使用go sdk调用GetTunnelEndpoint出现报错:InvalidAction.NotFoundSpecified api is not found,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
4月前
|
运维 Devops API
阿里云云效操作报错合集之直接用API调用可以使用,但是本地用Go代码调用失败,是什么导致的?
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5月前
|
关系型数据库 MySQL Go
Go语言介绍以及如何在Go语言中操作MySQL数据库
Go语言介绍以及如何在Go语言中操作MySQL数据库
58 3
|
5月前
|
运维 前端开发 Unix
用Go实现Ping操作
**摘要:** 本文介绍了 Ping 操作的原理和用途,并展示了如何用 Go 语言实现一个简单的 Ping 工具。Ping 是一个用于测试网络连接可达性和测量往返时间(RTT)的工具,常用于网络故障排查和监测网络稳定性。文中详细讲解了 ICMP 报文的结构,以及如何构建和发送 ICMP 请求报文,包括设置类型、代码、校验和、ID 和序列号等。通过示例代码,演示了如何编写 Go 代码实现 Ping 功能,包括计算校验和、设置超时、发送和接收数据包等步骤。
|
5月前
|
NoSQL 安全 Go
Go 语言 mongox 库:简化操作、安全、高效、可扩展、BSON 构建
go mongox 是一个基于泛型的库,扩展了 MongoDB 的官方库。通过泛型技术,它实现了结构体与 MongoDB 集合的绑定,旨在提供类型安全和简化的数据操作。 go mongox 还引入链式调用,让文档操作更流畅,并且提供了丰富的 BSON 构建器和内置函数,简化了 BSON 数据的构建。 此外,它还支持插件化编程和内置多种钩子函数,为数据库操作前后的自定义逻辑提供灵活性,增强了应用的可扩展性和可维护性。
94 6
|
5月前
|
存储 NoSQL Go
轻松上手,使用Go语言操作Redis数据库
轻松上手,使用Go语言操作Redis数据库