小编典典

在gorm中的结构中获取嵌套对象

go

我有两个结构:

type GoogleAccount struct {
     Id     uint64
     Token  string
}

它代表我的自定义PostgreSQL对象类型(我自己创建):

CREATE TYPE GOOGLE_ACCOUNT AS
(
  id    NUMERIC,
  token TEXT
);

下一个结构是DB中的表:

type Client struct {
     IdClient       uint64          `gorm:"primary_key"`
     Name           string
     PhotoUrl       string
     ApprovalNumber uint16
     Phone          string
     Password       string
     HoursOfNotice  int8
     Google         GoogleAccount
}

我的自定义对象嵌套在Client类型中,名为google。我尝试通过以下方式读取数据:

var users model.Client
db.First(&users)

但不幸的是,我无法读取字段google(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正在寻找新的方式,得到相同的结果,但更为优雅)。任务
不是简化表中数据的表示 。我需要 正确 地将对象从Postgres 映射 到实体。

现在,我找到了一个解决方案-将Scanner实施到GoogleAccount。但是输入法中的值为[] uint8。如我所料,[]
uint8可以转换为字符串,然后可以解析此字符串。该字符串(保存在db中)看起来像(x,x)-其中x-
是值。解析字符串并将值设置为对象的正确方法是吗?还是通过ORM获得此结果的方法?

是否有可能将这些数据读取为嵌套结构对象?


阅读 1141

收藏
2020-07-02

共1个答案

小编典典

现在,我找到了一个解决方案-将 Scanner
实施为GoogleAccount。在输入Scan方法时[]uint8,我将其转换为字符串并最终进行解析。这个字符串(保存在db中)看起来像(x,x)-其中x-是值。当然,这不是实现我目标的正确方法。但是我找不到其他解决方案。

强烈建议 按关系使用经典绑定,或者简单地将表中的这些字段保留为最简单的值(而不是作为对象)。

但是,如果您想在表中尝试嵌套对象,可以看看我的实现,也许对您有用:

type Client struct {
    // many others fields
    Google          GoogleAccount   `json:"google"`
}

type GoogleAccount struct {
    Id      uint64      `json:"id"`
    Token   string      `json:"token"`
}

func (google GoogleAccount) Value() (driver.Value, error) {
    return "(" + strconv.FormatUint(google.Id, 10) + "," + google.Token + ")", nil
}

func (google *GoogleAccount) Scan(value interface{}) error {
    values := utils.GetValuesFromObject(value)
    google.Id, _ = strconv.ParseUint(values[0], 10, 64)
    google.Token = values[1]
    return nil
}
2020-07-02