在gorm中的结构中获取嵌套对象
我有两个结构:
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.Clientdb.First(&users)
但不幸的是,我无法读取字段google
(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正在寻找新的方式,得到相同的结果,但更为优雅)。任务
。我需要 地将对象从Postgres 到实体。
现在,我找到了一个解决方案-将Scanner实施到GoogleAccount。但是输入法中的值为[] uint8。如我所料,[]
uint8可以转换为字符串,然后可以解析此字符串。该字符串(保存在db中)看起来像(x,x)
-其中x-
是值。解析字符串并将值设置为对象的正确方法是吗?还是通过ORM获得此结果的方法?
是否有可能将这些数据读取为嵌套结构对象?
回答:
现在,我找到了一个解决方案-将
实施为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
}
以上是 在gorm中的结构中获取嵌套对象 的全部内容, 来源链接: utcz.com/qa/432402.html