Postgresql go scan Postgres数组\u agg

Postgresql go scan Postgres数组\u agg,postgresql,go,Postgresql,Go,我在postgres中有一对多关系(Event有许多EventUser),希望扫描并存储到structEvent // EventUser struct type EventUser struct { ID int64 CheckedIn bool PaidAmount float32 } // Event struct type Event struct { ID int64 `json:"id

我在postgres中有一对多关系(Event有许多EventUser),希望扫描并存储到struct
Event

// EventUser struct
type EventUser struct {
    ID              int64
    CheckedIn       bool
    PaidAmount      float32
}

// Event struct
type Event struct {
    ID         int64  `json:"id"`
    Name       string `json:"name"`
    StartTime  string `json:"startTime"`
    EventUsers string
}
以下是查询:

SELECT events.id, events.name, events."startTime", e."eventUsers" as "eventUsers"
FROM "Events" as events
LEFT JOIN (
        SELECT events.id as id, array_to_json(array_agg(eu.*)) as "eventUsers"
        FROM "EventUsers" as eu
        JOIN "Events" AS "events" ON events.id = eu."eventId"
        WHERE eu.status = 'RESERVED'
        GROUP BY events.id
    ) AS e USING (id)
WHERE events.status = 'COMPLETED' 
查询将返回以下结果:

{
  id: 2,
  name: "2 Events are 48 days from now",
  startTime: 1590471343345,
  eventUsers: [
    {
      id: 2,
      checkedIn: false,
      paidAmount: 8
    },
    {
      id: 3,
      checkedIn: false, 
      paidAmount: 8,
    },
  ],
};

这就是我试图做的,它直接将
eventUsers
下的每个项目扫描到struct中,并存储在
事件的struct中

got := []Event{}

for rows.Next() {
    var r Event
    err = rows.Scan(&r.ID, &r.Name, &r.StartTime, &r.EventUsers)
    if err != nil {
        panic(err)
    }
}
我想我可以通过将数组存储为字符串,然后
unmarshal
it来实现这一点


我想要的是类似于
sql.NullString
的东西,您可以定义一个实现接口的切片类型。请注意,当您将实现Scanner的类型的实例传递给
(*sql.Rows).Scan
(*sql.Row).Scan
调用时,将自动调用推进器的
Scan
方法

type EventUserList []*EventUser

func (list *EventUserList) Scan(src interface{}) error {
    if data, ok := src.([]byte); ok && len(data) > 0 {
        if err := json.Unmarshal(data, list); err != nil {
            return err
        }
    }
    return nil
}
然后,假设select查询中的
e.“eventUsers”
是一个json数组,您可以这样使用它:

// EventUser struct
type EventUser struct {
    ID         int64
    CheckedIn  bool
    PaidAmount float32
}

// Event struct
type Event struct {
    ID         int64         `json:"id"`
    Name       string        `json:"name"`
    StartTime  string        `json:"startTime"`
    EventUsers EventUserList `json:"eventUsers"`
}

// ...

var events []*Event
for rows.Next() {
    e := new(Event)
    if err := rows.Scan(&e.ID, &e.Name, &e.StartTime, &e.EventUsers); err != nil {
        return err
    }
    events = append(events, e)
}

这就是多态性吗?@LeogoGesger我不确定多态性是否是一个精确的技术术语,但维基百科关于go接口系统的部分提到它提供了“运行时多态性”,所以是的,也许人们会这样称呼它。