GORM 读取别名字段(非表结构字段)值的方法
炒冷饭,在自己的博客里记录一下我之前在
Stack Overflow
和
链滴社区
提过的一个问题。
问题是查询结果中包含了表中不存在的一个别名字段,如何将这个非表结构字段的查询结果通过 GORM 读取到表对应的模型结构体中?
表结构是这样的
1DROP TABLE IF EXISTS "test"."test";
2CREATE TABLE "test"."test" (
3 "id" varchar(32) NOT NULL,
4 "name" varchar(255) COLLATE "pg_catalog"."default",
5 "remark" varchar(255) COLLATE "pg_catalog"."default"
7ALTER TABLE "test"."test" ADD CONSTRAINT "test_pkey" PRIMARY KEY ("id");
表对应模型结构体是这户事儿的
1type Test struct {
2 ID string `gorm:"column:id;type:varchar(32);primaryKey;comment:唯一 ID,流水号" json:"id"` // 唯一 ID,流水号
3 Name string `gorm:"column:name;type:varchar(255);comment:名称" json:"name"` // 名称
4 Remark string `gorm:"column:remark;type:varchar(255);comment:备注" json:"remark"` // 备注
6 MoreInfo string `gorm:"-" json:"moreInfo"` // 更多信息,非表结构字段
7}
GORM 查询代码
1test := Test{ID: "0000000001"}
2gormDB.Select("*, 'testMoreInfoVal' AS more_Info").Where(&test).Find(&test)
好吧,当时刚入门 Go 开发一段时间,也是刚开始用 GORM 不久,现在回过来看看我这个问题提的确实是有点蠢了。
🗨 哇哦,转眼都 7 个月过去了,马上都要 2022 年了,真的又是瞎忙的一年呢。
解决方案
有两种解决方案, 回复原文 是这样耐心告诉我的:
If the table structure is set and you aren't using AutoMigrate then this is solved by just changing your tags to make MoreInfo a read-only field and making sure you use the alias
more_info
to match the way Gorm does DB -> Go naming translation.
1type Test struct {
2 ID string `gorm:"column:id;type:varchar(32);primaryKey;comment:唯一 ID,流水号" json:"id"` // 唯一 ID,流水号
3 Name string `gorm:"column:name;type:varchar(255);comment:名称" json:"name"` // 名称
4 Remark string `gorm:"column:remark;type:varchar(255);comment:备注" json:"remark"` // 备注
6 MoreInfo string `gorm:"->" json:"moreInfo"` // 更多信息,非表结构字段
7}
If you are using AutoMigration then the problem will be that a more_info column will be created in your table, though Gorm will prevent writing to that column when using the struct.
What you could do in that case is use a new struct which embeds the Test struct like so:
1type Test struct {
2 ID string `gorm:"column:id;type:varchar(32);primaryKey;comment:唯一 ID,流水号" json:"id"` // 唯一 ID,流水号
3 Name string `gorm:"column:name;type:varchar(255);comment:名称" json:"name"` // 名称
4 Remark string `gorm:"column:remark;type:varchar(255);comment:备注" json:"remark"` // 备注
6 MoreInfo string `gorm:"->" json:"moreInfo"` // 更多信息,非表结构字段
9type TestExt struct {
10 Test
12 MoreInfo string `gorm:"->" json:"moreInfo"` // 更多信息