GORM 高级功能 |青训营

183 阅读5分钟

GORM 提供了许多高级功能,可以帮助开发者提高开发效率和数据库性能。

事务

事务是数据库操作的一种机制,它可以保证多个数据库操作的原子性、一致性、隔离性和持久性。

GORM 支持事务,可以使用 db.Begin() 函数开始一个事务,然后使用 db.Commit() 函数提交事务,使用 db.Rollback() 函数回滚事务。

Go

db, err := gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True")
if err != nil {
    // handle error
}

// 开始一个事务
tx := db.Begin()

// 执行数据库操作
user := User{
    Name: "John Doe",
    Email: "johndoe@example.com",
}

tx.Save(&user)

// 提交事务
tx.Commit()

请谨慎使用代码。了解详情

content_copy

上面的代码将创建一个用户记录,并将其保存到数据库中。

关联查询

关联查询是 GORM 提供的一种查询数据库的功能,它可以将多个表的数据查询出来。

GORM 支持多种关联查询,包括:

  • 一对一关联
  • 一对多关联
  • 多对多关联

一对一关联

一对一关联是指一个表中的记录与另一个表中的记录是一对一的映射关系。

GORM 使用 belongs_to() 来定义一对一关联。

Go

type User struct {
    gorm.Model
    ID uint
    Name string

    Address Address `gorm:"belongs_to"`
}

type Address struct {
    gorm.Model
    ID uint
    Country string
    State string
    ZipCode string

    UserID uint `gorm:"foreignkey:UserID"`
}

请谨慎使用代码。了解详情

content_copy

上面的代码定义了一个 User 表和一个 Address 表。User 表中的 Address 字段是一个 Address 类型的结构体,它使用 belongs_to() 定义了一对一关联。

要查询 User 表中的记录及其地址信息,可以使用 db.Preload() 函数。

Go

users := []User{}

// 查询 User 表中的所有记录及其地址信息
db.Preload("Address").Find(&users)

请谨慎使用代码。了解详情

content_copy

上面的代码将查询 User 表中的所有记录,并将其地址信息附加到每个记录中。

一对多关联

一对多关联是指一个表中的记录可以与另一个表中的多个记录建立关联关系。

GORM 使用 has_many() 来定义一对多关联。

Go

type User struct {
    gorm.Model
    ID uint
    Name string

    Posts []Post `gorm:"has_many"`
}

type Post struct {
    gorm.Model
    ID uint
    Title string

    UserID uint `gorm:"foreignkey:UserID"`
}

请谨慎使用代码。了解详情

content_copy

上面的代码定义了一个 User 表和一个 Post 表。User 表中的 Posts 字段是一个 Post 类型的切片,它使用 has_many() 定义了一对多关联。

要查询 User 表中的记录及其所有帖子,可以使用 db.Preload() 函数。

Go

users := []User{}

// 查询 User 表中的所有记录及其所有帖子
db.Preload("Posts").Find(&users)

请谨慎使用代码。了解详情

content_copy

上面的代码将查询 User 表中的所有记录,并将其所有帖子信息附加到每个记录中。

多对多关联

多对多关联是指两个表中的记录可以相互建立多对多关联关系。

GORM 使用 many_to_many() 来定义多对多关联。

Go

type User struct {
    gorm.Model
    ID uint
    Name string

    Languages []Language `gorm:"many_to_many"`
}

type Language struct {
    gorm.Model
    ID uint
    Name string
}

请谨慎使用代码。了解详情

content_copy

上面的代码定义了一个 User 表和一个 Language 表。User 表中的 Languages 字段是一个 Language 类型的切片,它使用 many_to_many() 定义了多对多关联。

要查询 User 表中的记录及其所有语言,可以使用 db.Preload() 函数。

Go

users := []User{}

// 查询 User 表中的所有记录及其所有语言
db.Preload("Languages").Find(&users)

请谨慎使用代码。了解详情

content_copy

上面的代码将查询 User 表中的所有记录,并将其所有语言信息附加到每个记录中。

子查询

子查询是 GORM 提供的一种查询数据库的功能,它可以将一个查询的结果作为另一个查询的条件。

GORM 使用 SELECT 语句来定义子查询。

Go

users := []User{}

// 查询所有用户名为 "John Doe" 的用户
db.Where("Name = ?", db.Select("Name").Where("Name = ?", "John Doe")).Find(&users)

请谨慎使用代码。了解详情

content_copy

上面的代码使用子查询查询了所有用户名为 "John Doe" 的用户。

分页查询

分页查询是 GORM 提供的一种查询数据库的功能,它可以将数据库查询结果分页显示。

GORM 使用 Offset()Limit() 函数来实现分页查询。

Go

users := []User{}

// 查询第 2 页,每页 10 条记录的用户
db.Offset(20).Limit(10).Find(&users)

请谨慎使用代码。了解详情

content_copy

上面的代码将查询第 2 页,每页 10 条记录的用户。

聚合查询

聚合查询是 GORM 提供的一种查询数据库的功能,它可以计算数据库表中的数据的统计信息。

GORM 使用 COUNT()SUM()AVG()MIN()MAX() 函数来实现聚合查询。

Go

count := 0

// 查询用户表中记录的总数
count = db.Model(&User{}).Count()

请谨慎使用代码。了解详情

content_copy

上面的代码将查询用户表中记录的总数。

全文搜索

全文搜索是 GORM 提供的一种查询数据库的功能,它可以根据用户输入的关键字来搜索数据库中的数据。

GORM 使用 FullTextSearch() 函数来实现全文搜索。

Go

users := []User{}

// 搜索用户名包含 "John" 的用户
db.FullTextSearch("Name", "John").Find(&users)

请谨慎使用代码。了解详情

content_copy

上面的代码将搜索用户名包含 "John" 的用户。

缓存

缓存是 GORM 提供的一种提高数据库性能的功能,它可以将数据库查询结果缓存起来,在下次查询相同数据时直接从缓存中取出数据,而不需要再查询数据库。

GORM 使用 DB.Cache() 函数来启用缓存。

Go

db.Cache()

请谨慎使用代码。了解详情

content_copy

上面的代码将启用缓存。

总结

GORM 提供了许多高级功能,可以帮助开发者提高开发效率和数据库性能。本文介绍了 GORM 的部分高级功能,开发者可以根据自己的需要来使用这些功能。