[GO]GORM 常用 Tag 速查手册

GORM 常用 Tag 速查手册

本手册按「功能场景」分类,整理 GORM 开发中高频使用的 Tag,包含 Tag 表达式、作用说明、数据库效果、使用示例,方便快速查阅与实操参考(默认数据库环境为 MySQL)。

一、字段映射与基础属性

用于控制结构体字段与数据库列的映射关系、数据类型等基础配置。

Tag 表达式 作用说明 数据库效果(MySQL) 使用示例
gorm:"column:自定义列名" 自定义数据库列名,覆盖默认蛇形命名(如 UserID 默认→user_id 列名设为「自定义列名」 ID uint gorm:"column:user_id"
gorm:"type:数据类型" 指定数据库字段类型,覆盖 GORM 对 Go 类型的默认推断(如 string 默认→varchar(255)) 列类型设为指定类型(如 varchar(50) Name string gorm:"type:varchar(50)"
gorm:"primaryKey" 标记字段为主键(支持复合主键,多个字段加此 Tag) 列添加 PRIMARY KEY 约束 ID uint gorm:"primaryKey"
gorm:"autoIncrement" 标记字段为自增(通常配合主键使用,uint 主键默认自增,非必需显式加) 列添加 AUTO_INCREMENT ID uint gorm:"primaryKey;autoIncrement"
gorm:"-" 忽略字段,不映射到数据库(不参与建表、CRUD 操作) 字段不生成对应列 Password string gorm:"-"

二、约束与默认值

用于添加数据库级别的字段约束(非空、唯一)和默认值配置。

Tag 表达式 作用说明 数据库效果(MySQL) 使用示例
gorm:"not null" 限制字段非空,插入/更新时必须传值(否则数据库报错) 列添加 NOT NULL 约束 Email string gorm:"not null"
gorm:"default:默认值" 设置数据库字段默认值(仅插入时生效,未传值则用默认值;注意:非 Go 代码默认值) 列添加 DEFAULT 默认值(如 DEFAULT 18 Age int gorm:"default:18"
gorm:"unique" 限制字段值唯一(仅加约束,不主动创建索引,建议优先用 uniqueIndex 列添加 UNIQUE 约束 Phone string gorm:"unique"

三、索引配置

用于创建数据库索引,提升查询效率(索引类型对应不同查询场景)。

Tag 表达式 作用说明 数据库效果(MySQL) 使用示例
gorm:"index" 创建普通索引(非唯一,适用于高频查询字段,如状态、分类) 生成 INDEX 索引名(列名)(如 INDEX idx_status(status) Status int gorm:"index"
gorm:"index:自定义索引名" 创建普通索引并指定索引名(避免默认名混乱,多字段索引必用) 生成 INDEX 自定义索引名(列1,列2) Age int gorm:"index:idx_user_age"
gorm:"uniqueIndex" 创建唯一索引(既保证值唯一,又提升查询效率,推荐替代 unique 生成 UNIQUE INDEX 索引名(列名) Email string gorm:"uniqueIndex"
gorm:"uniqueIndex:自定义索引名" 创建唯一索引并指定索引名(多字段唯一约束场景必备) 生成 UNIQUE INDEX 自定义索引名(列1,列2) Username string gorm:"uniqueIndex:idx_username"

四、时间自动填充

GORM 内置的时间字段自动管理,无需手动赋值(高频用于创建/更新时间)。

Tag 表达式 作用说明 数据库效果(MySQL) 使用示例
gorm:"autoCreateTime" 插入记录时,自动填充当前时间(仅触发一次,适用于 CreatedAt 字段) 列添加 DEFAULT CURRENT_TIMESTAMP CreatedAt time.Time gorm:"autoCreateTime"
gorm:"autoUpdateTime" 插入/更新记录时,自动填充当前时间(每次修改都更新,适用于 UpdatedAt 字段) 列添加 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP UpdatedAt time.Time gorm:"autoUpdateTime"

五、特殊功能

处理软删除、字段序列化等特殊业务场景。

Tag 表达式 作用说明 数据库效果(MySQL) 使用示例
gorm:"serializer:json" 将 Go 结构体/Map 序列化为 JSON 字符串存入数据库,读取时自动反序列化 列类型设为 text(存储 JSON 格式字符串) Profile map[string]any gorm:"serializer:json"
gorm:"index"(配合 gorm.DeletedAt 为软删除字段创建索引(gorm.DeletedAt 是 GORM 内置软删除类型,非 NULL 表示已删除) 列添加 INDEX 索引名(deleted_at),类型为 datetime DeletedAt gorm.DeletedAt gorm:"index"

六、常用 Tag 组合示例

实际开发中常将多个 Tag 组合使用,以下是典型场景的配置示例:

业务场景 结构体字段配置(Tag 组合) 说明
自增主键 ID uint gorm:"primaryKey;autoIncrement;column:user_id" 自定义列名 user_id,自增主键
唯一非空的用户邮箱 Email string gorm:"type:varchar(100);not null;uniqueIndex:idx_user_email" 限制长度+非空+唯一索引,防重复邮箱
带默认值的用户状态 Status int8 gorm:"type:tinyint;default:1;index:idx_user_status" 用 tinyint 省空间+默认启用+查询索引
软删除+自动时间 DeletedAt gorm.DeletedAt gorm:"index"<br>CreatedAt time.Time gorm:"autoCreateTime" ` 软删除索引+创建时间自动填充

七、使用提示

  1. 优先级规则 :字段显式 column Tag > 全局命名策略 > 默认蛇形命名。
  2. 索引注意:高频查询字段加普通索引,唯一值字段加唯一索引,避免过度索引(影响写入性能)。
  3. 默认值误区default 是数据库级默认值,若 Go 代码传"零值"(如 0、""),会覆盖默认值。
  4. 调试技巧 :开启 GORM 日志(Logger: logger.Default.LogMode(logger.Info)),可查看 Tag 对应的建表 SQL。
相关推荐
Narcissiffo2 小时前
【C语言】str系列函数
c语言·开发语言
workflower2 小时前
软件工程与计算机科学的关系
开发语言·软件工程·团队开发·需求分析·个人开发·结对编程
ajsbxi2 小时前
【Java 基础】核心知识点梳理
java·开发语言·笔记
阿珊和她的猫3 小时前
深入理解与手写发布订阅模式
开发语言·前端·javascript·vue.js·ecmascript·状态模式
懷淰メ3 小时前
python3GUI--模仿百度网盘的本地文件管理器 By:PyQt5(详细分享)
开发语言·python·pyqt·文件管理·百度云·百度网盘·ui设计
AntBlack3 小时前
虽迟但到 :盘一盘 SpringAI 现在发展得怎么样了?
后端·spring·openai
新子y3 小时前
【小白笔记】普通二叉树(General Binary Tree)和二叉搜索树的最近公共祖先(LCA)
开发语言·笔记·python
重整旗鼓~3 小时前
28.redisson源码分析分布式锁
java·开发语言
哼?~3 小时前
C++11标准 上 (万字解析)
开发语言·c++