【Go】新版GORM自动字段映射规则
新版 GORM(v2 及以上)的自动字段映射遵循一套清晰的规则,主要围绕结构体字段名到数据库列名的转换,以及特殊字段的默认处理,具体规则如下:
1. 命名转换规则(核心)
GORM 会将结构体的驼峰式命名(CamelCase) 自动转换为数据库的蛇形命名(snake_case),这是最常用的映射规则。
- 转换逻辑:在字段名的大写字母前添加下划线,并将所有字母转为小写。
- 示例:
- 结构体字段
StudentId
→ 数据库列student_id
- 结构体字段
ScoreValue
→ 数据库列score_value
- 结构体字段
CreatedAt
→ 数据库列created_at
- 结构体字段
ID
→ 数据库列id
(特殊处理:连续大写会被合并转换)
- 结构体字段
2. 特殊字段的默认映射
GORM 对一些特定名称的结构体字段有内置映射规则,无需额外配置:
ID
:默认作为主键(primaryKey
),映射到数据库列id
。CreatedAt
:自动映射到created_at
列,GORM 会在插入记录时自动填充当前时间。UpdatedAt
:自动映射到updated_at
列,GORM 会在更新记录时自动更新为当前时间。DeletedAt
:如果结构体包含该字段,GORM 会启用“软删除”功能,映射到deleted_at
列(未删除时为NULL
,删除时填充时间)。
3. 自定义映射(覆盖默认规则)
如果需要自定义列名(不遵循驼峰转蛇形),可以通过 gorm:"column:自定义列名"
标签显式指定,覆盖默认规则。
示例:
type Score struct {Id uint64 `gorm:"primaryKey" json:"id"` // 默认映射为 idStudentId uint64 `gorm:"column:stu_id" json:"student_id"` // 自定义为 stu_idSubject string `gorm:"column:course_name" json:"subject"` // 自定义为 course_name// ...
}
4. 忽略字段
如果某些结构体字段不需要映射到数据库列,可以通过 gorm:"-"
标签排除:
type Score struct {// ...TempData string `gorm:"-" json:"temp_data"` // 不会生成数据库列
}
5. 自定义映射的核心方式:配置 NamingStrategy
新版 GORM 支持自定义自动映射规则,可以通过配置 NamingStrategy
来修改默认的字段名、表名映射逻辑,满足特定的命名规范需求。
GORM 提供了 gorm.NamingStrategy
结构体,允许你自定义:
- 表名映射规则(结构体名 → 表名)
- 字段名映射规则(结构体字段名 → 数据库列名)
- 联表外键命名规则
- 索引命名规则
通过在初始化 GORM 时配置 NamingStrategy
即可生效。
示例:自定义字段名映射规则
默认规则是「驼峰转蛇形」,如果需要修改(例如改为全大写、添加前缀等),可以自定义 Column
函数:
import ("gorm.io/driver/sqlite""gorm.io/gorm""strings"
)// 自定义命名策略
namingStrategy := gorm.NamingStrategy{// 自定义字段名映射:将驼峰转为全大写(而非蛇形)Column: func(column string) string {// 示例:StudentId → STUDENTIDreturn strings.ToUpper(column)},// 可选:自定义表名映射(结构体名 → 表名)Table: func(table string) string {// 示例:在表名前加前缀 "t_"return "t_" + table},
}// 初始化 GORM 时应用命名策略
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{NamingStrategy: namingStrategy,
})
上述配置后:
- 结构体字段
StudentId
会映射为数据库列STUDENTID
(而非默认的student_id
) - 结构体
Score
会映射为表t_score
(而非默认的scores
)
更复杂的自定义示例(保持部分默认逻辑)
如果只想在默认规则基础上微调(例如给所有字段名加前缀),可以结合默认转换逻辑:
import ("gorm.io/gorm/schema""strings"
)namingStrategy := gorm.NamingStrategy{Column: func(column string) string {// 先使用默认的驼峰转蛇形,再添加前缀 "col_"defaultColumn := schema.NamingStrategy{}.Column(column) // 调用默认转换return "col_" + defaultColumn},
}
效果:
- 结构体字段
ScoreValue
→ 默认转换为score_value
→ 最终映射为col_score_value
注意事项
- 自定义规则全局生效,会影响所有结构体的映射。
- 若个别字段需要特殊处理,可以用
gorm:"column:xxx"
标签单独指定,优先级高于全局规则。 - 表名默认会在结构体名基础上做「驼峰转蛇形 + 复数化」(如
User
→users
),可通过SingularTable: true
禁用复数化:namingStrategy := gorm.NamingStrategy{SingularTable: true, // 表名不加复数后缀(User → user) }