亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

去掃描 Postgres array_agg

去掃描 Postgres array_agg

Go
慕婉清6462132 2022-05-23 18:03:19
我在 postgres 中有一對多的關系(Event 有很多 EventUser),并且想掃描并存儲到 structEvent中。// 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 string}這是查詢:SELECT events.id, events.name, events."startTime", e."eventUsers" as "eventUsers"FROM "Events" as eventsLEFT 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.
查看完整描述

1 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

您可以定義實現sql.Scanner接口的切片類型。請注意,當您將實現 Scanner 的類型的實例傳遞給(*sql.Rows).Scanor調用時,將自動調用(*sql.Row).Scanimpelmenter 的方法。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

}

然后,假設e."eventUsers"select 查詢中的 是一個 json array,你可以像這樣使用它:


// 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)

}


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號