📅  最后修改于: 2023-12-03 15:15:24.937000             🧑  作者: Mango
GORM是一款Go语言的ORM框架。 Preload和Unscoped分别是GORM提供的两个重要的功能。
Preload: 用于解决SQL中的N+1问题。它将在查询数据时自动预加载关联数据。
Unscoped: 可以在查询时禁用默认的作用域。使用unscoped你可以查询表中被软删除的记录。
当我们在查询数据的时候,如果要查询某个模型的关联数据,通常会进行N+1次查询操作。如果数据量较大,这将会是一个灾难性的性能问题。此时,就需要使用GORM提供的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查询的问题。
GORM使用软删除来删除数据。这是通过给表添加一个DeletedAt字段来实现的。当我们在查询数据时,默认会过滤掉DeletedAt不为0的记录。但是,在某些情况下,我们需要查询已被软删除的记录。这时,就需要使用GORM提供的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提供的两个非常实用的函数,可以提高我们的开发效率和代码质量。在实际开发中,我们应该灵活运用这两个函数。