使用GORM+SQLite自动迁移生成列时遇INSERT报错问题
解决GORM + SQLite生成列自动迁移报错问题
问题原因
SQLite中GENERATED ALWAYS AS类型的生成列是只读的,任何直接插入或更新该列的操作都会被拒绝。而GORM的AutoMigrate在变更表结构时,会创建临时表(如products__temp)并复制原表所有字段的数据,包括生成列,这就触发了cannot INSERT into generated column错误。
解决方案
修改结构体中生成列的GORM标签,明确标记字段为只读且不参与写入操作:
type Product struct { gorm.Model Name string `json:"name" gorm:"not null"` Quantity uint `json:"quantity" gorm:"not null"` Price float64 `json:"price" gorm:"not null"` Gain float64 `json:"gain" gorm:"not null"` // 添加 <-:false 禁止写入该字段,仅从数据库读取 Total float64 `json:"total" gorm:"->;<-:false;type:GENERATED ALWAYS AS (quantity*price);"` TotalGain float64 `json:"total_gain" gorm:"->;<-:false;type:GENERATED ALWAYS AS (quantity*gain);"` ProcessID uint // one-to-many }
标签说明
->:标记字段为只读,仅从数据库读取数据<-:false:明确禁止GORM对该字段执行写入操作(包括插入、更新和迁移时的数据复制)type:GENERATED ALWAYS AS (...):定义SQLite生成列的计算规则
后续操作
- 重新运行
AutoMigrate,此时GORM会自动忽略生成列的写入操作,避免触发SQLite的只读限制 - 如果之前的迁移已经导致表结构异常,建议先备份数据,再删除旧表后重新执行迁移
内容的提问来源于stack exchange,提问作者zakaria chahboun
相关产品推荐
相关产品推荐

