去扫描 Postgres array_agg

我在 postgres 中有一对多的关系(Event 有很多 EventUser),并且想扫描并存储到 structEvent中。


// 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到结构中,并存储在Event的结构中。


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一点。


我想要的是类似于sql.NullString.


慕婉清6462132
浏览 96回答 1
1回答

心有法竹

您可以定义实现sql.Scanner接口的切片类型。请注意,当您将实现 Scanner 的类型的实例传递给(*sql.Rows).Scanor调用时,将自动调用(*sql.Row).Scanimpelmenter 的方法。Scantype EventUserList []*EventUserfunc (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}然后,假设e."eventUsers"select 查询中的 是一个 json array,你可以像这样使用它:// EventUser structtype EventUser struct {    ID         int64    CheckedIn  bool    PaidAmount float32}// Event structtype Event struct {    ID         int64         `json:"id"`    Name       string        `json:"name"`    StartTime  string        `json:"startTime"`    EventUsers EventUserList `json:"eventUsers"`}// ...var events []*Eventfor 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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go