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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 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 "%罗%";


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL 关系型数据库 MySQL
go 通过sql操作mysql
go 通过sql操作mysql
119 1
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
1317 4
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
269 1
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
存储 安全 编译器
go语言中进行不安全的类型操作
【5月更文挑战第10天】Go语言中的`unsafe`包提供了一种不安全但强大的方式来处理类型转换和底层内存操作。包含两个文档用途的类型和八个函数,本文也比较了不同变量和结构体的大小与对齐系数,强调了字段顺序对内存分配的影响。
266 8
go语言中进行不安全的类型操作
|
SQL JSON Go
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
446 3
|
NoSQL 安全 Go
Go 语言 mongox 库:简化操作、安全、高效、可扩展、BSON 构建
go mongox 是一个基于泛型的库,扩展了 MongoDB 的官方库。通过泛型技术,它实现了结构体与 MongoDB 集合的绑定,旨在提供类型安全和简化的数据操作。 go mongox 还引入链式调用,让文档操作更流畅,并且提供了丰富的 BSON 构建器和内置函数,简化了 BSON 数据的构建。 此外,它还支持插件化编程和内置多种钩子函数,为数据库操作前后的自定义逻辑提供灵活性,增强了应用的可扩展性和可维护性。
269 13
|
关系型数据库 MySQL Go
Go语言介绍以及如何在Go语言中操作MySQL数据库
Go语言介绍以及如何在Go语言中操作MySQL数据库
201 3
|
运维 前端开发 Unix
用Go实现Ping操作
**摘要:** 本文介绍了 Ping 操作的原理和用途,并展示了如何用 Go 语言实现一个简单的 Ping 工具。Ping 是一个用于测试网络连接可达性和测量往返时间(RTT)的工具,常用于网络故障排查和监测网络稳定性。文中详细讲解了 ICMP 报文的结构,以及如何构建和发送 ICMP 请求报文,包括设置类型、代码、校验和、ID 和序列号等。通过示例代码,演示了如何编写 Go 代码实现 Ping 功能,包括计算校验和、设置超时、发送和接收数据包等步骤。
276 5
|
存储 NoSQL Go
轻松上手,使用Go语言操作Redis数据库
轻松上手,使用Go语言操作Redis数据库
213 2
|
存储 关系型数据库 MySQL