📜  gorm preload unscoped (1)

📅  最后修改于: 2023-12-03 15:15:24.937000             🧑  作者: Mango

GORM Preload 和 Unscoped
简介

GORM是一款Go语言的ORM框架。 Preload和Unscoped分别是GORM提供的两个重要的功能。

  • Preload: 用于解决SQL中的N+1问题。它将在查询数据时自动预加载关联数据。

  • Unscoped: 可以在查询时禁用默认的作用域。使用unscoped你可以查询表中被软删除的记录。

Preload

为什么要使用Preload

当我们在查询数据的时候,如果要查询某个模型的关联数据,通常会进行N+1次查询操作。如果数据量较大,这将会是一个灾难性的性能问题。此时,就需要使用GORM提供的Preload函数来优化查询。

Preload的使用

func (db *DB) Preload(query string, args ...interface{}) *DB

通过示例来说明Preload的使用:

我们有一个结构体News和Tag:

type News struct {
  ID int
  Title string
  Tags []Tag `gorm:"many2many:news_tags;"`
}

type Tag struct {
  ID int
  Name string
}

我们想要查询News表的数据,并同时关联Tags表的数据。这个时候,可以使用Preload来自动解决N+1问题。

var news []News
db.Preload("Tags").Find(&news)

以上代码就可以解决N+1查询的问题。

Unscoped

为什么要使用Unscoped

GORM使用软删除来删除数据。这是通过给表添加一个DeletedAt字段来实现的。当我们在查询数据时,默认会过滤掉DeletedAt不为0的记录。但是,在某些情况下,我们需要查询已被软删除的记录。这时,就需要使用GORM提供的Unscoped函数来查询被软删除的记录。

Unscoped的使用

func (db *DB) Unscoped() *DB

通过示例来说明Unscoped的使用:

我们有一个结构体User:

type User struct {
  gorm.Model
  Name string
  DeletedAt *time.Time
}

我们想要查询表中的被软删除的记录,这个时候,可以使用Unscoped来禁用软删除的过滤。

var users []User
db.Unscoped().Find(&users)

以上代码就可以查询被软删除的记录。

总结

Preload和Unscoped是GORM提供的两个非常实用的函数,可以提高我们的开发效率和代码质量。在实际开发中,我们应该灵活运用这两个函数。