как правильно сделать queryOne с go -pg? - PullRequest
1 голос
/ 21 апреля 2020

Я хочу queryOne, используя go-pg, который возвращает только одну строку объекта, а не массива.

Это мой простой код:

var reportMessage *ReportMessage
    _, err := db.Model((*ReportMessage)(nil)).QueryOne(&reportMessage, `
    SELECT 
        SUM(total_order) total_order,
        SUM(total_message) total_message,
        SUM(hsm_message) hsm_message ,
        SUM(outbound_message) outbound_message ,
        SUM(inbound_message) inbound_message ,
        SUM(total_order_amount) total_order_amount 
        FROM report_message rm WHERE seller_id =? and "date" between ? and ?;

    `, sellerID, dateStart, dateEnd)

    if err != nil {
        return nil, err
    }

    return reportMessage, nil
type ReportMessage struct {
    ID               string    `json:"id"`
    SellerID         string    `json:"seller_id"`
    TotalOrder       int       `json:"total_order"`
    Date             time.Time `json:"date"`
    HsmMessage       int       `json:"hsm_message"`
    TotalMessage     int       `json:"total_message"`
    OutboundMessage  int       `json:"outbound_message"`
    InboundMessage   int       `json:"inbound_message"`
    TotalOrderAmount float32   `json:"total_order_amount"`
}

I wi sh будет возвращать reportMessage только не массив.

и это моя ошибка:

json: cannot unmarshal number into Go value of type models.ReportMessage

как запросить только одну строку и вернуть ее объекту, а не массиву?

1 Ответ

1 голос
/ 23 апреля 2020

Вам нужно инициализировать экземпляр модели и передать указатель на этот экземпляр, а не передавать указатель на неинициализированный нулевой указатель модели.

reportMessage := new(ReportMessage)
_, err := db.Model((*ReportMessage)(nil)).QueryOne(reportMessage, `
SELECT 
    SUM(total_order) total_order,
    SUM(total_message) total_message,
    SUM(hsm_message) hsm_message ,
    SUM(outbound_message) outbound_message ,
    SUM(inbound_message) inbound_message ,
    SUM(total_order_amount) total_order_amount 
    FROM report_message rm WHERE seller_id =? and "date" between ? and ?;

`, sellerID, dateStart, dateEnd)

if err != nil {
    return nil, err
}

return reportMessage, nil
...