You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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生成列的计算规则

后续操作

  1. 重新运行AutoMigrate,此时GORM会自动忽略生成列的写入操作,避免触发SQLite的只读限制
  2. 如果之前的迁移已经导致表结构异常,建议先备份数据,再删除旧表后重新执行迁移

内容的提问来源于stack exchange,提问作者zakaria chahboun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:27:36