如何在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
相关产品推荐
相关产品推荐

