在 GORM 中,index标签不能和type:text或column等其他标签混合用分号分隔,而且TEXT类型直接建索引会有问题。
🔍 问题分析
语法错误:多个标签应该用空格分隔,而不是分号
TEXT 类型索引限制:MySQL 不允许对完整的
TEXT字段直接建索引
✅ 正确的写法
方案一:改用 VARCHAR(推荐)
go
// 消息实体:train_online ObjectType string `json:"objectType" gorm:"column:object_type;type:varchar(255);index:idx_type_id,priority:1"` // 消息关联实体Id train_online_id ObjectId int64 `json:"objectId,string" gorm:"column:object_id;index:idx_type_id,priority:2"`
方案二:必须用 TEXT + 指定前缀长度
go
// 消息实体:train_online ObjectType string `json:"objectType" gorm:"column:object_type;type:text;index:idx_type_id,priority:1,length:191"` // 消息关联实体Id train_online_id ObjectId int64 `json:"objectId,string" gorm:"column:object_id;index:idx_type_id,priority:2"`
方案三:使用单独的索引标签(更清晰)
go
// 消息实体:train_online ObjectType string `json:"objectType" gorm:"column:object_type;type:varchar(255)"` // 消息关联实体Id train_online_id ObjectId int64 `json:"objectId,string" gorm:"column:object_id"` // 在结构体末尾定义联合索引 func (YourModel) TableName() string { return "your_table_name" } // 或者在结构体上添加索引标记 // 使用单独的 gorm 标签(更推荐)go
type YourModel struct { ObjectType string `gorm:"column:object_type;type:varchar(255)"` ObjectId int64 `gorm:"column:object_id"` } // 定义索引(GORM v2 支持) func (YourModel) Indexes() map[string]gorm.Index { return map[string]gorm.Index{ "idx_type_id": { Columns: []string{"object_type", "object_id"}, }, } }📌 关键点总结
多个标签用空格分隔,不是分号
✅ 正确:
gorm:"column:object_type;type:text" json:"objectType"❌ 错误:
gorm:"index:xxx;column:xxx;type:text"然后分号分隔不同标签
GORM 标签的正确格式
go
`gorm:"标签1:值1;标签2:值2" json:"字段名"`
TEXT 字段加索引需要指定 length
go
`gorm:"type:text;index:idx_name,length:191"`
所以你的原写法主要问题是:
分号分隔了
index和column、type应该是空格分隔TEXT类型需要指定length参数
推荐使用方案一,将type:text改为type:varchar(255),这样最简单可靠。