Невозможно StructScan поле db строки типа, содержащее список объектов json, в Golang Struct

Я пишу программу go, которая считывает значения из mysql db и использует rows.StructScan демаршалирует ее в структуру go. Но одно из полей возвращает строку, содержащую список объектов json. Если sqlx возвращает db results в [] байте, StructScan должен иметь возможность демаршалировать строку сведений в структуру данных, но выдает следующую ошибку: имя "подробности": неподдерживаемое сканирование, сохранение driver.Value type [] uint8 в тип * [] main.Details

import (
 _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"github.com/jmoiron/sqlx/reflectx"
 "encoding/json"
)

type Entity struct {
	ID          int           `db:"id"`
	Date        *int          `db:"date"`
	Details     []Details 	  `db:"details"`
}

type Details struct {
	Name        *string `json:"name"`
	Description *string `json:"description"`
	Code        string  `json:"code"`
}

//removed error handling for now 

dataQuery, args, err := sqlx.In(DATA_QUERY,IDs)
rows, err := db.Queryx(dataQuery, args...)
entityList := []*Entity{}

// 1. Doesn't works
for rows.Next() {
	entity := &Entity{}
	err := rows.StructScan(&entity)
	entityList = append(entityList, entity)
}

   // 2. works
  for rows.Next() {
        entity := &Entity{}
        var desc string
        err := rows.Scan(&entity.ID,&entity.Date,&desc)
        err = json.Unmarshal([]byte(desc), &entity.Details)
	    entityList = append(entityList, entity)
   }

//  db query result :
  id: 15
date: 1590177397603
details:[{"name":"Abc","description":"String","code":"CO1"},
			  {"name":"123","description":"Numbers","code":"CO2"}]

Я не хочу использовать метод 2, потому что, скажем, если у меня много полей, сканирование сделает его уродливым и упустит преимущество StructScan. Как мне иначе это сделать?


person stan606    schedule 22.05.2020    source источник


Ответы (1)


Для столбца с типом JSON ваше поле структуры должно иметь тип [] byte, другого пути нет.

В этом случае я бы использовал метод mapscan (), после сканирования я обработал бы конкретный ключ, передав его функции, которая демаршалирует байт [] в определенную структуру или карту.

Если вы все еще хотите, чтобы ваш результат был структурой, преобразуйте карту в структуру, используя некоторую библиотеку. https://godoc.org/github.com/mitchellh/mapstructure

person sharad regoti    schedule 23.05.2020