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

如何在GORM中设置可读但不可写入的字段?

问题描述

DDL语句

create table if not exists T
(
    A bigint,
    B bigint,
    C bigint generated always as (A + B) stored
);

Go结构体模型(初始版本)

type T struct {
    A int64
    B int64
    C int64
}

遇到的问题

  • 插入数据时触发报错:ERROR: cannot insert into column "C" (SQLSTATE 42601),原因是C为数据库存储型生成列,不支持手动插入值。
  • 若给C字段添加gorm:"-"标签,插入操作恢复正常,但查询时无法获取C字段的计算值。
解决方案

使用GORM的字段读写控制标签,在单个结构体中实现插入忽略C字段、查询正常读取C字段的需求,修改后的结构体如下:

type T struct {
    A int64
    B int64
    C int64 `gorm:"<-:false;->"`
}

标签解释

  • <-:false:指定该字段禁止写入操作,执行INSERT/UPDATE时GORM会自动跳过该字段,规避生成列的插入限制。
  • ->:指定该字段允许读取操作,执行SELECT时GORM会将数据库中C列的计算值映射到结构体字段。

通过该配置,同一个结构体即可完成所有读写操作,无需拆分独立的读写结构体。

内容的提问来源于stack exchange,提问作者Sergey Drobov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:42:07