gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:01:26 26 4
gpt4 key购买 nike

我有两个结构:

type GoogleAccount struct {
Id uint64
Token string
}

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

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

下一个结构是数据库中的表:

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 到实体的正确映射

现在我找到了一个解决方案 - 对 GoogleAccount 实现扫描程序。但是输入法中的值是[]uint8。如我所料,[]uint8 可以转换为字符串,然后我可以解析该字符串。这个字符串(保存在数据库中)看起来像 (x,x) - 其中 x - 是值。解析字符串并将值设置为对象的正确方法是什么?或者是通过 ORM 得到这个结果的方法?

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

最佳答案

看起来您想要用现有的东西做两件事:(1) 更新模型以便您拥有正确的关系绑定(bind),以及 (2) 使用 .Preload()方法,如果你试图让它关联读取的数据。

模型变更

Gorm 根据结构中的属性名称和引用结构的名称自动推断关系。问题是 GoogleAccount 类型的 Google 属性没有关联,因为 gorm 正在寻找 type Google struct

您还缺少 GoogleAccount 上的外键。 ORM 如何知道将哪个 GoogleAccount 与哪个 Client 相关联?您应该将 ClientId 添加到您的 GoogleAccount 结构定义中。

此外,我会更改您用来键入 uint 的主键,因为这是 gorm 默认的(除非您有充分的理由不使用它)

如果我是你,我会将我的结构定义更改为以下内容:

type Client struct {
IdClient uint `gorm:"primary_key"`
Name string
PhotoUrl string
ApprovalNumber uint16
Phone string
Password string
HoursOfNotice int8
GoogleAccount GoogleAccount // Change this to `GoogleAccount`, the same name of your struct
}

type GoogleAccount struct {
Id uint
ClientId uint // Foreign key
Token string
}

有关这方面的更多信息,请查看此处的协会文档:http://gorm.io/associations.html#has-one

预加载关联

现在您实际上已将它们正确关联,您可以.Preload() 获取您想要的嵌套对象:

db.Preload("GoogleAccount").First(&user)

使用 .Preload() 将根据 ClientId GoogleAccount 填充 user.GoogleAccount 属性.

有关这方面的更多信息,请查看预加载文档:http://gorm.io/crud.html#preloading-eager-loading

关于postgresql - 在gorm中获取结构中的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com