Выбор массива int из Postgres в struct и последующая его сортировка

#sql #postgresql #go

# #sql #postgresql #Вперед

Вопрос:

У меня есть следующая структура:

 type Payment struct {
    ...
    PaymentMethods []int64 `json:"paymentMethods,omitempty" db:"payment_methods"`
}
 

В базе данных Postgres у меня есть простой []int столбец с именем payment_methods в таблице платежей.

Мне нужно выполнить простой запрос Select, чтобы получить эту структуру, а затем маршалировать ее, чтобы вернуть ее в REST API в формате json.

Однако, когда я запускаю следующее:

 payment := Payment{}
err := psql.db.Unsafe().Get(amp;payment, "select * from payments where id = $1", id)
 

Я получаю сообщение об ошибке :
sql: Scan error on column index 12, name "payment_methods": unsupported Scan, storing driver.Value t

Теперь я знаю, что могу использовать pq.Int64Array тип вместо []int . Однако часть сортировки не будет работать для этого. Я хочу найти более простое решение, которое не добавляло бы ненужных накладных расходов (если, конечно, это невозможно).

Затем упорядоченная структура кодируется в этой части:

 func (handler *Handler) respond(w http.ResponseWriter, r *http.Request, data interface{}, status int) {
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    w.WriteHeader(status)
    if data != nil {
        err := json.NewEncoder(w).Encode(data)
        if err != nil {
            errors.Wrap(err, "Response Error while encoding data to json")
            http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
        }
    }
}
 

Как я могу справиться с этим общим способом?

Я использую sqlx с драйвером pgx.

Комментарии:

1. что такое сортировка, которая не работает? Можете ли вы уточнить свой вопрос с утверждениями в сочетании с минимальными воспроизводимыми примерами? play.golang.org/p/5H6qGO0Eokd

2. Кроме предложения из ссылки, единственное, что приходит на ум в данный момент, — это создание пользовательского типа из []int64 и реализация Scan для этого пользовательского типа. opsdash.com/blog/postgres-arrays-golang.html

3. Извините, я не уверен, что вы имели в виду. Я отредактировал свой пост и добавил ту часть, где происходит кодирование для упорядоченной структуры. И сама сортировка происходит, когда я вызываю psql.db.Unsafe().Get(amp;payment, ....

4. хорошо, вы имели в виду, что pg выполняет маршалинг, а не маршалинг json rest api. Требуется, чтобы тип, который вы используете для маршалирования значения базы данных от pg до go, когда это тривиальный тип on, реализовывал интерфейс db.Scanner, описанный здесь golang.org/pkg/database/sql/#Scanner Таким образом, вы должны объявить это свойство payment_methods с типом, который реализует интерфейс сканера, таким образом, use pq.Int64Array . Эта ошибка возникает из-за того, что тип []int не реализует интерфейс db.Scanner .