【问题标题】:How GORM reads the value of the alias fieldGORM如何读取别名字段的值
【发布时间】:2021-05-17 07:43:35
【问题描述】:

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

表结构

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");

表对应模型结构

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将表中不存在的别名字段more_Info读入Test结构的MoreInfo属性中?

【问题讨论】:

    标签: postgresql go go-gorm


    【解决方案1】:

    如果设置了表结构并且您没有使用 AutoMigrate,那么只需更改标签以使 MoreInfo 成为只读字段并确保使用别名 more_info 来匹配 Gorm 执行 DB 的方式即可解决此问题-> 去命名翻译。

    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,那么问题将是在您的表中创建一个 more_info 列,尽管 Gorm 会在使用该结构时阻止写入该列。

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2012-01-23
      • 2021-04-07
      相关资源
      最近更新 更多