官方中文文档

0、安装

1
2
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

1.连接到数据库

GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB

连接到mysql数据库

1
2
3
4
5
dsn := "root:root@tcp(127.0.0.1:3306)/gormtest?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

2. GORM模型

gorm.Model

GORM 提供了一个预定义的结构体gorm.Model。其中包含常用的字段

1
2
3
4
5
6
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}

image-20241128180051471

  • ID :每个记录的唯一标识符(主键)。
  • CreatedAt :在创建记录时自动设置为当前时间。
  • UpdatedAt:每当记录更新时,自动更新为当前时间。
  • DeletedAt:用于软删除(将记录标记为已删除,而实际上并未从数据库中删除)。

可以将gorm.Model 嵌套到自己的结构体中。

image-20241128180403223

gorm.AutoMigrate()是 GORM 中用于自动同步数据库结构的功能,它会根据定义的模型(model)自动创建或更新数据库中的表结构。

AutoMigrate 会根据你的 Go 结构体模型自动生成或修改数据库表,不会删除表中的数据。

AutoMigrate自动创建的表的表名默认为结构体的复数形式

image-20241128192624882

image-20241128192730197

可以通过给结构体绑定一个TableName方法来更改生成的表名

image-20241128193027832

image-20241128193049811

查询

查询单个对象

  • db.First(&user)获取第一条记录 主键升序 ==》SELECT * FROM users ORDER BY id LIMIT 1;
  • db.Take(&user) 获取一条记录,没有指定排序字段 ==》SELECT * FROM users LIMIT 1;
  • db.Last(&user) 获取最后一条记录(主键降序)==》SELECT * FROM users ORDER BY id DESC LIMIT 1;

image-20241128194701237

db.First(&us)会将查询到的结合返回给us。返回一个setting.User类型

db.First()db.Last()是通过主键排序的方法找到第一条与最后一条数据的

如果model没有定义主键,那么将会安装model第一个字段进行排序

根据主键检索

主键是整数

如果主键是整数的话。可以db.First()给第二个参数传入一个整数。db.First(&user, 10)会查询主键为10的第一条数据

1
2
3
4
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;

image-20241128195639753

如果给db.Find传入一个int类型的数组,会返回id等于数组中的值的数据

1
2
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);

主键是字符串

当主键是字符串的时候可以通过格式化字符串的形式向db.First()传入一个字符串。这样db.First()会返回搜索到的第一个结果

1
2
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";

String条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 获得第一个符合条件的对象
db.Where("name = ?", "Yliken1").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;

// 查找所有的
db.Where("name <> ?", "Yliken1").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';

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

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

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

image-20241128200314130

Struct & Map 条件

1
2
3
4
5
6
7
8
9
10
11
// 数据库中的 users 表中查找name =Yliken age =18 的用户
db.Where(&User{Name: "Yliken", Age: 18}).First(&user)
// SELECT * FROM users WHERE name = "Yliken" AND age = 18 ORDER BY id LIMIT 1;

// 数据库中的 users 表中查找name =Yliken age =18 的用户
db.Where(map[string]interface{}{"name": "Yliken", "age": 18}).Find(&users)
// SELECT * FROM users WHERE name = "Yliken" AND age = 18;

// 数据库中的 users 表中查找ID为20、21和22 的所有用户。
db.Where([]int64{20, 21, 22}).Find(&users)
// SELECT * FROM users WHERE id IN (20, 21, 22);

Not 条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Not
db.Not("name = ?", "Yliken").First(&user)
// SELECT * FROM users WHERE NOT name = "Yliken" ORDER BY id LIMIT 1;

// Not In
db.Not(map[string]interface{}{"name": []string{"Yliken", "Yliken1"}}).Find(&users)
// SELECT * FROM users WHERE name NOT IN ("Yliken", "Yliken1");

// Struct形式
db.Not(User{Name: "Yliken", Age: 18}).First(&user)
// SELECT * FROM users WHERE name <> "Yliken" AND age <> 18 ORDER BY id LIMIT 1;

// 不在某个主键集合中的记录
db.Not([]int64{1,2,3}).First(&user)
// SELECT * FROM users WHERE id NOT IN (1,2,3) ORDER BY id LIMIT 1;