gorm基础

Getting Start

gorm是一个Go语言编写的ORM框架

一、基本使用

1.1.安装

使用go get

1
go get -u github.com/jinzhu/gorm

或者在项目中import之后,使用go mod tidy自动下载依赖

1.2.连接数据库

1.3.CURD

1.3.1.创建

1.3.1.查询

https://gorm.io/zh_CN/docs/query.html

查询单个对象
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
var user User
var users []User


// =======================
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段;返回的结果取决于数据库实现,有可能每次都是相同的
// Take return a record that match given conditions, the order will depend on the database implementation
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error // returns error or nil

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

// 指定db.Model查询
result := map[string]interface{}{}
db.Model(&User{}).First(&result)


// =======================
// 通过主键查询
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
// 主键是字符串
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")



// =======================
// 也可以先初始化实例,然后进行查询
var user = User{ID: 10}
db.First(&user)
// SELECT * FROM users WHERE id = 10;


检索全部对象
1
2
3
4
5
6
7
8
result := db.Find(&users)
// SELECT * FROM users;
// 查询之后,数据放在内存,大表要避免这种操作


result.RowsAffected // returns found records count, equals `len(users)`
result.Error // returns error

条件查询
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

// Get first matched record
db.Where("name = ?", "xx").First(&user)
// SELECT * FROM users WHERE name = 'xx' ORDER BY id LIMIT 1;


// Get all matched records
db.Where("name <> ?", "xx").Find(&users)
// SELECT * FROM users WHERE name <> 'xx';

// IN
db.Where("name IN ?", []string{"xx1", "xx2"}).Find(&users)
// SELECT * FROM users WHERE name IN ('xx1','xx2');


// LIKE
db.Where("name LIKE ?", "%xx%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%xx%';


// AND
db.Where("name = ? AND age >= ?", "xx", "11").Find(&users)
// SELECT * FROM users WHERE name = 'xx' AND age >= 11;

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2022-01-01 00:00:00';

// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2022-01-01 00:00:00' AND '2022-01-08 00:00:00';

Distinct查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

// Select Distince
var data []string
db.Model(&User{}).Distinct("name").Find(&data)
// SELECT DISTINCT(`name`) FROM `users`

// 注意,如果查询的字段名称是关键字(例如index),需要这么写
db.Model(&User{}).Distinct("`index`").Find(&data)


// Count with Distinct
var count int64
db.Model(&User{}).Distinct("name").Count(&count)
// SELECT COUNT(DISTINCT(`name`)) FROM `users`


二、GORM Model定义

2.2.结构体tags

在使用struct声明model的时候,可以选择加上一些tags,实现附加的功能

2.2.1.字段相关标签

结构体标记(Tag) 描述
column 指定数据库的列名
type 指定列数据类型,例如bool、int
size 指定列大小, 默认值255
primaryKey 将列指定为主键
unique 将列指定为唯一(添加唯一约束)
default 指定列默认值
precision 指定列精度
not null 将列指定为非空
autoIncrement 指定列为自增类型
autoIncrementIncrement 指定列自增的步长
index 创建索引,为多个字段使用相同的名称创建复合索引
uniqueIndex 和 index 类似,只不过创建的是唯一索引
comment 迁移时为字段添加注释
<- 设置列的写权限
-> 设置列的读权限
- 忽略该字段,- 无读/写权限,``-:migration 无迁移权限,-:all` 无读/写/迁移权限

2.1.2.关联相关的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 是否自动完成预加载的相关操作

Refs