我有两个结构:
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。我尝试通过以下方式读取数据:
google
var users model.Client db.First(&users)
但不幸的是,我无法读取字段google(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正在寻找新的方式,得到相同的结果,但更为优雅)。任务 不是简化表中数据的表示 。我需要 正确 地将对象从Postgres 映射 到实体。
现在,我找到了一个解决方案-将Scanner实施到GoogleAccount。但是输入法中的值为[] uint8。如我所料,[] uint8可以转换为字符串,然后可以解析此字符串。该字符串(保存在db中)看起来像(x,x)-其中x- 是值。解析字符串并将值设置为对象的正确方法是吗?还是通过ORM获得此结果的方法?
(x,x)
是否有可能将这些数据读取为嵌套结构对象?
现在,我找到了一个解决方案-将 Scanner 实施为GoogleAccount。在输入Scan方法时[]uint8,我将其转换为字符串并最终进行解析。这个字符串(保存在db中)看起来像(x,x)-其中x-是值。当然,这不是实现我目标的正确方法。但是我找不到其他解决方案。
GoogleAccount
Scan
[]uint8
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 }