[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。
相关推荐
红尘散仙3 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记4 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
isyangli_blog4 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008114 小时前
FastAPI APIRouter
开发语言·python
Benszen4 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆4 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木4 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
喵个咪4 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
杨充5 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~5 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言