You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从GORM模型中获取字段名称、类型及相关信息?

从GORM模型提取字段元数据的实现方案

要获取GORM模型的字段名称、类型及其他元数据,直接利用GORM内置的schema包和Statement解析器即可,无需额外依赖。以下是具体实现步骤:

核心实现代码

首先导入必要的GORM包:

import (
  "gorm.io/gorm"
  "gorm.io/gorm/schema"
)

编写一个通用函数,传入GORM连接和模型实例,返回所有字段的元数据:

func ExtractModelFields(db *gorm.DB, model interface{}) ([]schema.Field, error) {
  stmt := &gorm.Statement{DB: db}
  // 解析模型结构体,生成Schema信息
  if err := stmt.Parse(model); err != nil {
    return nil, err
  }
  // 返回解析后的所有字段
  return stmt.Schema.Fields, nil
}

字段元数据详解

解析后得到的schema.Field结构体包含你需要的所有关键信息:

  • field.Name:模型结构体中的字段名(如Name)
  • field.DBName:映射到数据库的列名(会自动识别gorm:"column:xxx"标签)
  • field.Type.Name():字段的Go语言类型名称(如string、uint)
  • field.PrimaryKey:布尔值,标记该字段是否为主键
  • field.AutoIncrement:布尔值,标记是否为自增字段
  • field.NotNull:布尔值,标记字段是否非空
  • field.DefaultValue:字段的数据库默认值(对应gorm:"default:xxx"标签)
  • field.Tag.Get("gorm"):获取完整的gorm标签内容,可进一步解析额外约束
  • field.Tag.Get("form"):如果你的模型定义了表单相关自定义标签,可直接提取用于表单生成

使用示例

假设你有如下模型:

type User struct {
  ID        uint   `gorm:"primaryKey;autoIncrement"`
  Username  string `gorm:"column:user_name;not null" form:"username"`
  Age       int    `gorm:"default:18" form:"age"`
  Email     string `gorm:"unique" form:"email"`
}

调用函数并遍历字段信息:

fields, err := ExtractModelFields(db, &User{})
if err != nil {
  // 处理解析错误
}

for _, field := range fields {
  // 打印字段核心信息
  println("模型字段名:", field.Name)
  println("数据库列名:", field.DBName)
  println("字段类型:", field.Type.Name())
  println("是否主键:", field.PrimaryKey)
  println("表单标签:", field.Tag.Get("form"))
}

注意事项

  • 对于嵌套结构体,需添加gorm:"embedded"标签,否则解析器不会将嵌套字段纳入Fields列表
  • 如果需要处理指针类型字段,field.Type会返回指针的底层类型,可通过field.Type.Elem()获取
  • 若模型包含关联关系(如BelongsTo、HasMany),可通过stmt.Schema.Relations获取关联信息

内容的提问来源于stack exchange,提问作者jordiburgos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:57:19