Gorm学习
# 部署MySQL
使用gorm之前我们要先准备mysql环境(已有mysql环境可以跳过这步)
# 安装Gorm依赖
go get -u github.com/jinzhu/gorm
1
# 连接数据库
连接不同的数据库都需要导入对应数据的驱动程序,GORM已经贴心的为我们包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可:
import _ "github.com/jinzhu/gorm/dialects/mysql"
1
连接MySQL
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Quick start
package main
import (
"fmt"
"log"
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// User 用户信息
type User struct {
ID uint `gorm:"primaryKey"` // 设置主键
Name string
Email string `gorm:"uniqueIndex"` // 设置值唯一
Age int
CreatedAt time.Time
UpdatedAt time.Time
}
func main() {
var (
host = "localhost"
port = 13306
userName = "root"
pwd = "root123"
dbName = "mock"
)
link := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
userName,
pwd,
host,
port,
dbName,
)
db, err := gorm.Open("mysql", link)
if err != nil {
log.Fatal(err)
}
// 用完一定要记得关闭数据库连接
defer db.Close()
// 禁止复表(默认生成的表名尾巴带个s,需要设置禁止带s)
db.SingularTable(true)
// 自动迁移(用于自动创建或更新数据库表)
db.AutoMigrate(&User{})
user1 := User{Name: "John", Email: "john@example.com", Age: 25}
user2 := User{Name: "Leong", Email: "leong@example.com", Age: 27}
// 添加表记录
if err := db.Create(&user1).Error; err != nil {
log.Fatal(err)
}
if err := db.Create(&user2).Error; err != nil {
log.Fatal(err)
}
/* 查询 */
// 读取单条记录
res1 := User{}
if err := db.First(&res1).Error; err != nil {
log.Fatal(err)
}
// {1 John john@example.com 25 }
fmt.Println(res1)
var res2 User
// 条件查询单条记录
if err := db.Find(&res2, "name = ?", "Leong").Error; err != nil {
log.Fatal(err)
}
// {2 Leong leong@example.com 27 }
fmt.Println(res2)
// /* 更新 */
if err := db.Model(&res2).Update("age", 18).Error; err != nil {
log.Fatal(err)
}
// {2 Leong leong@example.com 18}
fmt.Println(res2)
// /* 删除 */
if err := db.Delete(&res2).Error; err != nil {
log.Fatal(err)
}
}
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 创建表
AutoMigrate
db.AutoMigrate(&User{})
1
自动迁移:
- 如果表不存在,则创建表
- 如果表存在,则检查表结构,并添加新的列或索引,以匹配模型定义
- 自动添加或更新外键约束
CreateTable
db.CreateTable(&User{})
1
表创建:
- 仅创建表,不会影响已有的表结构
总结:
- 开发阶段:
- 使用
AutoMigrate
更为方便和高效,能够快速响应模型结构的变化,适合快速迭代开发。
- 使用
- 生产环境:
- 使用
CreateTable
以及配合手写迁移脚本或专门的迁移工具(如 Golang Migrate)。这种方式更为稳定,能够精细控制数据库的变化,适合严格控制数据库结构变化的生产环境。
- 使用
# 结构体定义
让我们来重新看一下quick start中的结构体定义
type User struct {
ID uint `gorm:"primaryKey"` // 设置主键
Name string `gorm:"column:normal_name"` // 自定义列名
Email string `gorm:"uniqueIndex"` // 设置值唯一
Age int
CreatedAt time.Time
UpdatedAt time.Time
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Gorm Tags
可以发现ID
以及Email
等字段带了结构体标记(tags),使用结构体声明模型时,标记(tags)是可选项。gorm支持以下标记:
结构体标记(Tag) | 描述 | |
---|---|---|
Column | 指明列名 | |
Type | 指定列数据类型 | |
Size | 指定列大小, 默认值255 | |
PRIMARY_KEY | 将列指定为主键 | |
UNIQUE | 将列指定为唯一 | |
DEFAULT | 指定列默认值 | |
PRECISION | 指定列精度 | |
NOT NULL | 将列指定为非 NULL | |
AUTO_INCREMENT | 指定列是否为自增类型 | |
INDEX | 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引 | |
UNIQUE_INDEX | 和 INDEX 类似,只不过创建的是唯一索引 | |
EMBEDDED | 将结构设置为嵌入 | |
EMBEDDED_PREFIX | 设置嵌入结构的前缀 | |
- | 忽略此字段 |
关联相关标记(tags)
结构体标记(Tag) | 描述 | |
---|---|---|
MANY2MANY | 指定连接表 | |
FOREIGNKEY | 设置外键 | |
ASSOCIATION_FOREIGNKEY | 设置关联外键 | |
POLYMORPHIC | 指定多态类型 | |
POLYMORPHIC_VALUE | 指定多态值 | |
JOINTABLE_FOREIGNKEY | 指定连接表的外键 | |
ASSOCIATION_JOINTABLE_FOREIGNKEY | 指定连接表的关联外键 | |
SAVE_ASSOCIATIONS | 是否自动完成 save 的相关操作 | |
ASSOCIATION_AUTOUPDATE | 是否自动完成 update 的相关操作 | |
ASSOCIATION_AUTOCREATE | 是否自动完成 create 的相关操作 | |
ASSOCIATION_SAVE_REFERENCE | 是否自动完成引用的 save 的相关操作 | |
PRELOAD | 是否自动完成预加载的相关操作 |
# Gorm Model
上面的结构体我们也可以换种写法,加上gorm.Model
type User struct {
gorm.Model
Name string
Email string `gorm:"uniqueIndex"` // 设置值唯一
Age int
}
1
2
3
4
5
6
2
3
4
5
6
为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。
gorm.Model
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `sql:"index"`
}
1
2
3
4
5
6
2
3
4
5
6
PS:
CreatedAt
字段的值将会自动赋值上初次创建记录的时间UpdatedAt
字段值将会是每次记录更改的时间
# CRUD
常用的crud可以参考李文周大佬的博客以及官方文档
上次更新: 2024/07/08, 18:19:51