gorm的find和scan使用

在 GORM 中,.Find() 和 .Scan() 都可以用于检索数据库记录,但它们之间存在一些差异,并不完全等同于彼此。

使用例子

Find 方法的使用例子

  1. 查找单一记录:

var result models.MyModel
db.Where(“id = ?”, 1).Find(&result)
这个例子中,我们查找 id 为 1 的记录,并将结果填充到 result 变量中。

  1. 查找多个记录并排序:

var results []models.MyModel
db.Where(“active = ?”, true).Order(“created_at desc”).Find(&results)
这里,我们查找所有 active 为 true 的记录,并将它们按 created_at 时间戳降序排列,结果被填充到 results 切片中。

Scan 方法的使用例子

  1. 读取单条记录:

var result models.MyModel
db.Table(“my_table”).Where(“id = ?”, 1).Scan(&result)
在这个例子中,我们直接从 my_table 表中读取 id 为 1 的记录,并将结果填充到 result 变量中。

  1. 读取多条记录:

var results []models.MyModel
db.Table(“my_table”).Where(“active = ?”, true).Scan(&results)
这里,我们从 my_table 表中读取所有 active 为 true 的记录,并将它们填充到 results 切片中。

  1. 读取特定列:

type Result struct {
Name string
Age int
}

var results []Result
db.Table(“my_table”).Select(“name, age”).Scan(&results)
在这个例子中,我们定义了一个 Result 结构体来匹配我们想要检索的列,然后从 my_table 表中读取 name 和 age 列的数据。
4. 执行原始 SQL 查询:

var results []struct {
TotalCount int
TotalPages int
}
db.Raw(“SELECT COUNT() AS total_count, (SELECT COUNT() FROM my_table WHERE active = ?) AS total_pages”, true).Scan(&results)

主要区别

Find 和 Scan 都是 GORM(Go 语言的 ORM 库)中用于从数据库检索数据的方法,但它们之间存在一些差异。

Find 方法:
Find 方法主要用于查找和返回所有匹配的记录。它会将结果直接映射到你为其提供的结构体或结构体切片中。例如:

go
复制
var users []User
db.Find(&users)
在这个例子中,Find 方法会查找所有的用户记录,并将它们映射到 users 切片中。

Scan 方法:
Scan 方法用于将结果扫描到另一个结构体中,这个结构体可能与原始模型的结构不同。这在你只需要查询的结果的子集,或者结果需要映射到不同的结构体时非常有用。例如:

go
复制
type UserDTO struct {
Name string
Age int
}

var userDTOs []UserDTO
db.Model(&User{}).Select(“name, age”).Scan(&userDTOs)
在这个例子中,Scan 方法只选择 name 和 age 字段,并将结果映射到 UserDTO 切片中,而不是 User 结构体。

总的来说,Find 和 Scan 的主要区别在于,Find 用于将结果映射到与数据库模型相同的结构体中,而 Scan 则可以将结果映射到一个不同的结构体中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值