「Go」Go 组件系列文章3-gorm

简介

GORM 是一个用于构建 Go 语言应用程序的对象关系映射(ORM)库。它可以帮助开发人员在 Go 语言项目中更轻松地使用数据库。它支持多种数据库,包括 MySQL、PostgreSQL 和 SQLite,并提供了一组简单易用的 API,可以让开发人员使用 Go 语言的结构体来描述数据库表和字段,并通过这些结构体来执行数据库操作。并支持事务、批量操作等等。和Javahibernate框架相似。

相关链接:

GitHub

GORM中文网

使用

安装

要使用 gorm.io/gorm,首先需要安装它。可以使用 Go 语言的包管理工具 go mod 来安装:

1
2
go get gorm.io/gorm
go get gorm.io/driver/mysql

安装完成后,在 Go 语言项目中就可以引入 gorm 包并使用它了。首先,需要创建一个 gorm.DB 类型的变量,用于表示与数据库的连接:

1
2
3
import "gorm.io/gorm"

var db *gorm.DB

然后,使用 gorm.Open() 函数来连接到数据库:

1
2
3
4
5
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("failed to connect database")
}
defer db.Close()

其中 user 和password 为连接数据库的用户和密码,dbname 为库名,后面设置根据自己需求设置。

以下为完整实例:

创建数据库的步骤忽略,我们约定数据库名称为star-im,用户名和密码均为root。

项目根目录/src/test/pkg 目录下新建 test_gorm.go 测试文件,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

// TestProduct 定义一个实体
type TestProduct struct {
// gorm.Model 提供了基础实体的定义,包含了id, CreatedAt, UpdatedAt, DeletedAt 字段
gorm.Model
// Name 商品名称
Name string
// Price 商品价格
Price uint
}

// 测试 ORM 框架 —— 连接 MySQL https://github.com/go-gorm/gorm
func main() {
// 连接信息,字符串中内容分别为:用户名:密码@连接方式(Host:Port)/数据库名?字符集&解析时间&默认时间
// 更多参数详见:https://github.com/go-sql-driver/mysql#parameters
dsn := "root:root@tcp(127.0.0.1:3306)/star-im?charset=utf8mb4&parseTime=True&loc=Local"
// 连接数据库,并设置基本的配置
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
// 如果连接有异常则打印
fmt.Println("连接数据库失败:", err)
}

// 迁移 schema,如果数据库该表没有则创建表
err = db.AutoMigrate(&TestProduct{})
if err != nil {
fmt.Println("创建数据库表异常:", err)
}

// Create 创建记录
// 定义实体
product := &TestProduct{Name: "奶茶", Price: 100}
// 创建记录
result := db.Create(product)
// 创建成功后会返回插入数据的主键给实体赋值 ID
fmt.Println("ID为:", product.ID)
fmt.Println("如果有异常,则会输出:", result.Error)
fmt.Println("返回插入记录的条数:", result.RowsAffected)

// Find 查询
prod := db.First(&product, "name = ?", "奶茶")
fmt.Println("查询数:", prod.RowsAffected)

// 查找后返回实体
prod2 := TestProduct{}
db.Where("name = ?", "奶茶").First(&prod2)
fmt.Println("实体:", prod2)

// Update - 修改
// 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(TestProduct{Price: 200, Name: "蛋糕"})
// 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Name": "蛋糕"})

// Delete - 逻辑删除 product,会修改 deleted_at,标记为删除
db.Delete(&product, 1)
}

执行程序后在控制台输出如下结果:

1
2
3
4
5
ID为: 1
如果有异常,则会输出: <nil>
返回插入记录的条数: 1
查询数: 1
实体: {{1 2022-11-22 16:53:58.969 +0800 CST 2022-11-22 16:53:58.969 +0800 CST {0001-01-01 00:00:00 +0000 UTC false}} 奶茶 100}

其他更多操作请参考 GORM中文网 ,以及 约束连接池日志 等配置可根据自身需求学习设置。我在后续过程中也会讲解并设置。