Postgresql go scan Postgres数组\u agg
我在postgres中有一对多关系(Event有许多EventUser),希望扫描并存储到structPostgresql 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
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接口系统的部分提到它提供了“运行时多态性”,所以是的,也许人们会这样称呼它。