
gorm 默认使用驼峰命名转蛇形命名的规则映射字段,但当数据库字段名为 `spe_name` 等非标准蛇形格式时,需通过 `gorm:"column:xxx"` 标签显式指定列名,才能正确读取数据。
在使用 GORM(如 v1.x)进行数据库操作时,结构体字段与数据库列名的映射并非总是自动准确——尤其当 MySQL 表中存在带下划线且大小写混合的字段名(如 spe_Name)时,GORM 默认的命名转换规则(SpeName → spe_name)无法匹配该列,导致查询结果为空或字段值未被赋值(如 specialty.SpeName 打印为空字符串)。
解决方法是在对应结构体字段上添加 GORM 的 column 标签,显式声明其映射的数据库列名:
type Specialties struct {
SpeId int64 `gorm:"column:spe_Id"`
SpeName string `gorm:"column:spe_Name"` // ✅ 显式映射到数据库列 spe_Name
Conditions sql.NullString `gorm:"column:conditions"`
ParentId sql.NullInt64 `gorm:"column:parent_id"`
Hidden sql.NullInt64 `gorm:"column:hidden"`
}⚠️ 注意事项:
- column 标签仅影响字段映射,不改变建表行为;若调用 AutoMigrate,GORM 仍会按默认规则生成列名(除非配合 gorm:"column:xxx" + gorm:"not null" 等完整标签),因此建议在已有表结构上使用时禁用自动建表;
- 字段首字母必须大写(即导出),否则 GORM 无法访问(Go 反射限制);
- 若字段名完全匹配(如 SpeName 对应 spe_name),可省略标签;但 spe_Name 是大小写敏感的非标准命名,必须显式指定;
- GORM v2(gorm.io/gorm)同样支持该语法,标签格式一致。
最后,确保你的查询逻辑能正确加载数据——例如 Specialties 切片应来自 db.Find(&Specialties) 等有效查询,而非未初始化的空切片。否则即使标签正确,specialty.SpeName 仍可能为空。










