Сканирование неструктурированного JSON BYTEA в строку map [string] - PullRequest
0 голосов
/ 03 марта 2020

Это похоже на распространенную проблему и может быть уже где-то опубликовано, но я не могу найти ни одной темы, говорящей об этом, поэтому вот проблема:

У меня есть таблица Postgres, хранящая столбец типа BYTEA.

CREATE TABLE foo (
  id         VARCHAR PRIMARY KEY,
  json_data  BYTEA
)

Столбец json_data на самом деле просто JSON хранится как BYTEA (я знаю, что это не идеал). Он неструктурирован, но гарантированно имеет значение string -> string JSON.

Когда я запрашиваю эту таблицу, мне нужно отсканировать запрос SELECT * FROM foo WHERE id = $1 в следующую структуру:

type JSONData map[string]string

type Foo struct {
  ID    string   `db:"id"`
  Data  JSONData `db:"json_data"`
}

Я использую sqlx Get метод. Когда я выполняю запрос, я получаю сообщение об ошибке sql: Scan error on column index 1, name "json_data": unsupported Scan, storing driver.Value type []uint8 into type *foo.JSONData.

Очевидно, что сканер испытывает проблемы при сканировании JSON BYTEA на карту. Я могу реализовать свой собственный сканер и вызвать свой собственный сканер в столбце json_data, но мне интересно, есть ли лучшие способы сделать это. Может ли мой тип JSONData реализовать существующий интерфейс, чтобы сделать это автоматически?

1 Ответ

0 голосов
/ 03 марта 2020

Как подсказывает @iLoveReflection, реализация интерфейса Scanner на *JSONData работала. Вот фактическая реализация:

func (j *JSONData) Scan(src interface{}) error {
    b, ok := src.([]byte)
    if !ok {
        return errors.New("invalid data type")
    }

    return json.Unmarshal(b, j)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...