在 Gorm 中,Scan 是一个用于将查询结果映射到自定义结构体或变量的函数。与 Find 或 First 不同,Scan 允许你将查询结果存储到与数据库模型不完全匹配的结构体中。它特别适合用于自定义查询结果或联合查询的场景。
type Result struct {
Name string
Email string
}
var result Result
db.Table("users").Select("name, email").Where("id = ?", 1).Scan(&result)
在上面这个例子中,Scan 方法将查询结果映射到 Result 结构体中。
type Stats struct {
MaxAge int
}
var stats Stats
db.Table("users").Select("max(age) as max_age").Scan(&stats)
问题:查询结果返回的字段是max_age,为什么能匹配到结构体的MaxAge ?
在 Gorm 中,Scan 会将查询结果的字段名自动映射到结构体的字段名,遵循以下规则:
-
字段名大小写无关:Gorm 会忽略字段名的大小写进行匹配。即使查询结果的字段名是 max_age,它仍然会匹配到结构体中的 MaxAge 字段。
-
下划线与驼峰命名法的转换:Gorm 会尝试将查询结果中的下划线格式(如 max_age)与结构体的驼峰命名格式(如 MaxAge)进行对应。这种转换是自动完成的。