GORM入门
学习方法(3w1h)
- 第一步:先到百度搜索几篇基本的用法案例,粘贴过来测试一下(基本了解)
- 第二步:到官方系统的整理(最好整理成博客)只能学会语法
- 第三步:如何融入到项目中( GitHub、gitee ),开源项目( 抄 ) 40K+
- 第四步:读源码和实现原理( 面试为什么问底层? )
# 1.1 什么是ORM?
orm是一种术语而不是软件
- 1)orm英文全称object relational mapping,就是 ==对象映射关系== 程序;
- 2)简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的;
- 3)为了保证一致的使用习惯,通过 orm将编程语言的对象模型和数据库的关系模型建立映射关系;
- 4)这样我们直接 使用编程语言的对象模型进行操作数据库 就可以了,而不用直接使用sql语言;
# 1.2 什么是GORM?
GORM是一个神奇的,对开发人员友好的 Golang ORM 库。
- 全特性 ORM (几乎包含所有特性)
- 模型关联 (一对一, 一对多,一对多 (反向), 多对多, 多态关联)
- 钩子 (Before/After Create/Save/Update/Delete/Find)
- 预加载
- 事务
- 复合主键
- SQL 构造器
- 自动迁移
- 日志
- 基于GORM回调编写可扩展插件
- 全特性测试覆盖
- 开发者友好
# 1.3 GORM(v3)基本使用
安装
go get -u gorm.io/gorm
1
连接MySQL
# 创建一个数据库
mysql> create database test_db charset utf8; # 创建数据库
mysql> use test_db; # 切换到数据库
mysql> show tables; # 查看是否生成表
+-------------------+
| Tables_in_test_db |
+-------------------+
| users |
+-------------------+
mysql> desc users; # 查看表的字段是否正常
+----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| username | longtext | YES | | NULL | |
| password | longtext | YES | | NULL | |
+----------+------------+------+-----+---------+----------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
创建mysql连接
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err)
}
fmt.Println(db) // &{0xc00018a630 <nil> 0 0xc000198380 1}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
自动创建表
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// User 表的结构体ORM映射
type User struct {
Id int64 `gorm:"primary_key" json:"id"`
Username string
Password string
}
func main() {
// 1、连接数据库
dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// 2、自动创建表
db.AutoMigrate(
User{},
)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
基本增删改查
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// User 表的结构体ORM映射
type User struct {
Id int64 `gorm:"primary_key" json:"id"`
Username string
Password string
}
func main() {
// 0、连接数据库
dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db.AutoMigrate(User{})
// 1、增
db.Create(&User{
//Id: 3,
Username: "zhangsan",
Password: "123456",
})
// 2、改
db.Model(User{
Id: 3,
}).Update("username", "lisi")
// 3、查
// 3.1 过滤查询
u := User{Id: 3}
db.First(&u)
fmt.Println(u)
// 3.2 查询所有数据
users := []User{}
db.Find(&users)
fmt.Println(users) // [{2 zhangsan 123456} {3 lisi 123456}]
// 4、删
// 4.1 删除 id = 3 的用户
db.Delete(&User{Id: 3})
// 4.2 条件删除
db.Where("username = ?", "zhangsan").Delete(&User{})
}
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
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
# 1.4 模型定义
# 1.4.1 模型定义
模型一般都是普通的 Golang 的结构体,Go的基本数据类型,或者指针。
type User struct {
Id int64 `gorm:"primary_key" json:"id"`
Name string
CreatedAt *time.Time `json:"createdAt" gorm:"column:create_at"`
Email string `gorm:"type:varchar(100);unique_index"` // 唯一索引
Role string `gorm:"size:255"` //设置字段的大小为255个字节
MemberNumber *string `gorm:"unique;not null"` // 设置字段唯一且不为空
memberNumber
Num int `gorm:"AUTO_INCREMENT"` // 设置 Num字段自增
Address string `gorm:"index:addr"` // 给Address 创建一个名字是 `addr`的索引
IgnoreMe int `gorm:"-"` //忽略这个字段
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 1.4.2 支持结构标签
标签是声明模型时可选的标记。
标签 | 说明 |
---|---|
Column | 指定列的名称 |
Type | 指定列的类型 |
Size | 指定列的大小,默认是 255 |
PRIMARY_KEY | 指定一个列作为主键 |
UNIQUE | 指定一个唯一的列 |
DEFAULT | 指定一个列的默认值 |
PRECISION | 指定列的数据的精度 |
NOT NULL | 指定列的数据不为空 |
AUTO_INCREMENT | 指定一个列的数据是否自增 |
INDEX | 创建带或不带名称的索引,同名创建复合索引 |
UNIQUE_INDEX | 类似 索引 ,创建一个唯一的索引 |
EMBEDDED | 将 struct 设置为 embedded |
EMBEDDED_PREFIX | 设置嵌入式结构的前缀名称 |
- | 忽略这些字段 |
上次更新: 2022/07/11, 00:22:51