[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。
相关推荐
星释6 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
悟能不能悟8 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
循环过三天8 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
_院长大人_10 小时前
设计模式-工厂模式
java·开发语言·设计模式
MATLAB代码顾问10 小时前
MATLAB实现决策树数值预测
开发语言·决策树·matlab
码事漫谈10 小时前
C++死锁深度解析:从成因到预防与避免
后端
码事漫谈10 小时前
智能体颠覆教育行业:现状、应用与未来展望调研报告
后端
蓝-萧10 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key10 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
韩立学长10 小时前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端