mysql - 无法Struct将包含json对象列表的字符串类型的db字段扫描到Golang Struct中

标签 mysql json go struct sqlx

我正在编写一个go程序,该程序从mysql db中读取值并使用rows.StructScan将其解码到go结构中。但是其中一个字段返回一个包含json对象列表的字符串。如果sqlx返回以[] byte为单位的db结果,则StructScan应该能够将详细信息字符串解码到detail结构中,但会出现以下错误: name“details”:不支持的扫描,将driver.Value类型的值存储为[] 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方法,因为如果我有很多字段,那么Scan将使其看起来很丑陋,并且错过了StructScan的优势。我应该如何进行呢?

最佳答案

对于类型为 JSON JSON 的列,您的struct字段应为[] byte类型,没有其他解决方法。

在这种情况下,我将使用 mapscan()方法,在扫描后,我将通过将特定键传递给将[]字节解码到特定结构或映射的函数来处理该特定键。

如果仍然希望将结果构造为结构,请使用某些库将映射转换为结构。
https://godoc.org/github.com/mitchellh/mapstructure

关于mysql - 无法Struct将包含json对象列表的字符串类型的db字段扫描到Golang Struct中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61963266/

相关文章:

json - 如何使用 angularjs 在本地存储中保存 json 响应?

javascript - 我对这个 Angularjs ng-repeat 做错了什么?

mongodb - 如何将字符串转换为BSON

go - 如何获得分配给机器的所有 IP 地址?

基于 2 个表的 MySQL 计数值(使用 group by?)

java - 如何使用 Elasticsearch 从索引同步数据库

MySQL Sum 列 IF ID 在另一个表查询中

php - 通过 cPanel cron 自动备份 MySQL 数据库和发送电子邮件

python - 如何将 Tweepy 对象中的数据提取到 Pandas 数据框中?

json - Golang 服务器,如何接收 TCP JSON 数据包?