
`gorm:"primary_key"` 是 gorm orm 框架用于声明结构体字段为主键的结构体标签,它告诉 gorm 在数据库迁移和查询时将该字段作为主键处理(如自增、索引、where 条件默认依据等)。
在 GORM 中,结构体字段通过 gorm 标签(即反引号内 gorm:"..." 的字符串)向框架传递元信息。其中 primary_key 是一个关键指令,用于显式指定某字段为数据库表的主键(Primary Key)。例如:
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"size:100"`
Email string `gorm:"uniqueIndex"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `gorm:"index"`
}在此例中,ID 字段被标记为 gorm:"primary_key",GORM 在执行自动迁移(db.AutoMigrate(&User{}))时,会生成类似 id SERIAL PRIMARY KEY(PostgreSQL)或 id INT PRIMARY KEY AUTO_INCREMENT(MySQL)的建表语句。同时,GORM 的 CRUD 方法(如 First()、Save()、Delete())也默认以该字段作为记录定位依据。
⚠️ 注意事项:
- 若未显式指定 primary_key,GORM 会自动约定:名为 ID(大小写不敏感)且类型为整型(uint, int, int64 等)的字段将被隐式视为主键;
- 但显式标注 gorm:"primary_key" 更清晰、可读性更强,且支持非 ID 字段(如 UUID stringgorm:"primary_key;type:uuid"`)作为主键;
- 复合主键需使用 gorm:"primaryKey;column:xxx" 配合多个字段,并启用 gorm.Model 或自定义主键逻辑(GORM v2+ 推荐使用 gorm.Model 或 PrimaryKey 选项);
- 该标签仅影响 GORM 行为,不会改变 Go 结构体本身的语义,也不参与 JSON 序列化等其他标签系统。
简言之,gorm:"primary_key" 是 GORM 实现“约定优于配置”的重要扩展点——它既尊重默认约定,又提供精确控制能力,是构建健壮数据模型的基础实践之一。









