Gorm字段级权限不生效:PostgreSQL自增ID读写权限配置问题
解决方案
针对你遇到的Gorm搭配PostgreSQL时,主键id仅保留读取权限、创建时不自动插入的问题,提供两种可靠解决方法:
方法一:使用Gorm字段权限标签(适配Gorm v2)
直接通过标签明确字段的读写权限,同时标记主键:
type User struct { Id int `gorm:"column:id;primaryKey;<-:false"` UUID string `gorm:"column:uuid"` FirstName string `gorm:"column:firstname"` MidName string `gorm:"column:midname"` LastName string `gorm:"column:lastname"` }
primaryKey:让Gorm识别该字段为主键,匹配PostgreSQL的主键约束<-:false:禁止该字段的所有写入操作(包括创建、更新)- 读取权限是Gorm默认开启的,无需额外添加
->标签
方法二:使用指针类型字段利用Gorm忽略nil值特性
将id字段改为指针类型,利用Gorm自动忽略nil字段的逻辑:
type User struct { Id *int `gorm:"column:id;primaryKey"` UUID string `gorm:"column:uuid"` FirstName string `gorm:"column:firstname"` MidName string `gorm:"column:midname"` LastName string `gorm:"column:lastname"` }
- 创建时
Id默认是nil,Gorm不会向数据库插入该字段,PostgreSQL会自动通过序列生成主键值 - 读取时数据库返回的id值会被正常赋值给指针,可直接通过
user.Id获取(需注意指针非空判断,不过PostgreSQL主键不会为null)
补充:修正Omit方法的正确写法
如果你依然想使用Omit方式,需调整调用顺序:
postgres.DB.Omit("id").Create(&newUser)
直接在Create前链式调用Omit,而非先指定Model再Omit,避免Gorm内部逻辑覆盖Omit规则。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

