【问题标题】:Querying Postgres composite types from golang从 golang 查询 Postgres 复合类型
【发布时间】:2017-06-06 22:13:57
【问题描述】:

所以我使用 go-gorp 来查询 postgres,但我似乎无法查询我的表中的复合类型给出了错误。我想要的只是适当嵌套的 JSON 响应。我的 postgres 架构是:

CREATE TYPE PhoneType AS ENUM ('MOBILE', 'HOME', 'WORK');

CREATE TYPE PhoneNumber AS (
  "Number" VARCHAR,
  "Type" PhoneType
);

CREATE TABLE Person (
  "Id" SERIAL PRIMARY KEY NOT NULL,
  "Name" VARCHAR NOT NULL,
  "Email" VARCHAR,
  "Number" PhoneNumber[]
);

相应地在golang中,我有

const (
  MOBILE PhoneType = iota
  HOME
  WORK
)

type PhoneNumber struct {
  Number string
  Type   PhoneType
}

type Person struct {
  Id          int
  Name        string
  Email       string
  PhoneNumber        // not sure how to get array of phone numbers here
}

为了查询,我使用 go-gorp 如下:

dbmap := &gorp.DbMap{Db: db, Dialect: gorp.PostgresDialect{}}
var data []Person
_, err := dbmap.Select(&data, "SELECT * FROM Person")

我得到的结果有格式

{
  "Id":
  "Name":
  "Email"
  "Number": "{\"(..., ...)\"}"
  "Type": 0
}

我期待的是:

{
  "Id":
  "Name":
  "Email":
  "PhoneNumber": [{
    "Number":
    "Type":
  }]
}

如何将此嵌套复合类型更改为对我在 go 中的声明友好的类型?

编辑:看起来 postres 数组和复合类型在 go 中变成了字符串。如何重新设计架构以达到类似的结果?

【问题讨论】:

    标签: postgresql go gorp


    【解决方案1】:

    你的类型声明错误,试试这个例子:

    type Phone struct {
       Number string
       Type   PhoneType
    }
    
    type Person struct {
      Id            int
      Name          string
      Email         string
      PhoneNumber   []Phone     
    }
    

    【讨论】:

    • 我已经尝试过了,这是我得到的错误 sql: Scan error on column index 3: unsupported Scan, storage driver.Value type []uint8 into type *[]main.PhoneNumber
    • 解决不了,unsupported Scan, storing driver.Value type []uint8 into type *[]main.PhoneNumber
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2015-06-02
    • 2023-03-03
    • 2021-07-31
    • 1970-01-01
    • 2022-01-07
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多