GORM 如何读取别名字段的值

How GORM reads the value of the alias field

查询数据时,为字段设置别名。如何使用 GORM 将别名字段的值读入结构中?

Table结构

DROP TABLE IF EXISTS "test"."test";
CREATE TABLE "test"."test" (
  "id" varchar(32) NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default",
  "remark" varchar(255) COLLATE "pg_catalog"."default"
);
ALTER TABLE "test"."test" ADD CONSTRAINT "test_pkey" PRIMARY KEY ("id");

Table对应模型结构

type Test struct {
    ID     string `gorm:"column:id;type:varchar(32);primaryKey;comment:Unique ID" json:"id"`
    Name   string `gorm:"column:name;type:varchar(255);comment:Name Info" json:"name"`
    Remark string `gorm:"column:remark;type:varchar(255);comment:Remark Info" json:"remark"`

    MoreInfo string `gorm:"-" json:"moreInfo"` // Non-table field

}

GORM查询

gormDB是初始化的gorm数据库连接。

test := Test{ID: "0000000001"}
gormDB.Select("*, 'testMoreInfoVal' AS more_Info").Where(&test).Find(&test)

问:如何使用GORM将table中不存在的别名字段more_Info读入[=16=的MoreInfo属性中]结构?

如果设置了 table 结构并且您没有使用 AutoMigrate,则只需更改您的标签以使 MoreInfo 成为只读字段并确保您使用别名 more_info 以匹配 Gorm 做 DB -> Go 命名翻译的方式。

type Test struct {
    ID     string `gorm:"column:id;type:varchar(32);primaryKey;comment:Unique ID" json:"id"`
    Name   string `gorm:"column:name;type:varchar(255);comment:Name Info" json:"name"`
    Remark string `gorm:"column:remark;type:varchar(255);comment:Remark Info" json:"remark"`

    MoreInfo string `gorm:"->" json:"moreInfo"` // Non-table field

}

gormDB.Select("*, 'testMoreInfoVal' AS more_info").Where(&test).Find(&test)

如果您正在使用 AutoMigration,那么问题将是在您的 table 中创建一个 more_info 列,尽管 Gorm 会在使用该结构时阻止写入该列。

在这种情况下你可以做的是使用一个嵌入测试结构的新结构,如下所示:

type Test struct {
    ID     string `gorm:"column:id;type:varchar(32);primaryKey;comment:Unique ID" json:"id"`
    Name   string `gorm:"column:name;type:varchar(255);comment:Name Info" json:"name"`
    Remark string `gorm:"column:remark;type:varchar(255);comment:Remark Info" json:"remark"`
}

type TestExt struct{
    Test 
    MoreInfo string `gorm:"->" json:"moreInfo"`
}

testext := TestExt{}
gormDB.Model(&Test{}).
    Select("*, 'testMoreInfoVal' AS more_info").
    Where(Test{ID: "0000000001"}).
    Find(&testext)