#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.html3. Извините, я не уверен, что вы имели в виду. Я отредактировал свой пост и добавил ту часть, где происходит кодирование для упорядоченной структуры. И сама сортировка происходит, когда я вызываю
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 .