gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:22:56 24 4
gpt4 key购买 nike

我正在编写一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com