【问题标题】:Storing and retrieving Golang slice, struct and slice of struct in Postgresql在 Postgresql 中存储和检索 Golang 切片、结构和结构切片
【发布时间】:2017-12-09 01:13:55
【问题描述】:

假设我有一个名为PEOPLE,它存储Person 的行。但是,Person 包含 slicestructslice of struct,即 Superpower VehicleFriendList 字段。

我应该如何使用 GolangPostgresql 中存储和检索这些值?我找不到与此问题相关的任何实用教程。使用自定义数据类型,或者 JSON,或者 ORM 方法,或者构建自定义函数来处理这些?有很多意见,但我仍然无法找到解决此问题的有效方法,请帮助。

我正在使用Ozzo-dbx,但是,欢迎任何解决方案。

有人可以提供一个工作示例吗?对不起,如果这个新手问题激怒了你,但我已经尝试了几天,并且一直失败......(T_T)

type Transport struct {
    Brand string
    Size  int
}

type Friend struct {
    Name         string
    IsProgrammer bool
}

type Person struct {
    ID         int
    Name       string
    Superpower []string   //slice
    Vehicle    Transport  //struct
    FriendList []Friend   //slice of struct
}

【问题讨论】:

  • 您可以将slicestructslice of struct值存储为JSON格式,以及其他值as is(所以IDintNamestring ETC)。这将是合乎逻辑的:)
  • SuperPowerVehicleFriendList 属性如何存储在数据库中?您是否控制该决定或是否有相关表格?如果由您决定,那么您有很多选择;如果已经设置了数据库结构,那么您只需要处理这些关联...
  • 我希望将这些字段(SuperPowerVehicleFriendList)存储为 Golang 中的数据类型.这是最简单的。希望这些字段可以在没有 JSON 编码的情况下存储,那是最快。如果可以在没有关联的相对表的情况下进行存储,那将是优雅。如果可能的话,我希望用dot notation来访问数据库,比如SELECT Person.Vehicle.Brand ...,那么这可能会很好地实现...可以吗? :)

标签: postgresql go


【解决方案1】:

在大多数情况下,您应该为 Superpowers、Vehicles 和 Friends 创建单独的表。

如果这些表之一与 People 表之间的关系是多对一或一对一的,您可以向它们添加外键。如果关系是多对多的,您应该创建一个链接表来保存相关记录的 fkey。

要存储数据,您可以使用简单的 SQL 查询字符串和 database/sql 单独插入/更新每条记录。

之后,您可以创建表格视图,将您想要的每个人的数据汇总到一行中,这样您就不会用复杂的 SQL 字符串污染您的 Go 代码。然后在 Go 中定义简单的 SQL 选择查询字符串并使用 database/sql 执行它们。

【讨论】:

  • 是的,谢谢您的建议...嗯...网站前端使用了太多的嵌套对象,因为这将简化他们的工作流程...嵌套对象和数组无处不在...哈哈...我在Postgresql中读到了自定义数据类型,希望那将是我的救星...嗯...无论如何,谢谢您的建议...将尝试实现关系表如果找不到更好的解决方案:)
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 2014-03-25
  • 2013-09-13
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多