首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在jsonb字段中插入map[string]

问如何在jsonb字段中插入map[string]
EN

Stack Overflow用户
提问于 2021-08-26 19:07:28
回答 2查看 395关注 0票数 0

我有一个结构Huygens

代码语言:javascript
复制
type Huygens struct {
    Worlds map[string]World `json:"worlds" sql:"type:JSONB"`
}

type World struct {
    Diameter int
    Name string
}

当我尝试使用GORM插入到Postgres DB中时,我得到:

代码语言:javascript
复制
sql: converting argument $1 type: unsupported type map[string]huygens.world, a map

要插入,我只需使用db.Create(&World{})

有人知道如何将该列作为JSONB列插入并避免该错误吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2021-08-26 22:11:43

您需要将Huygens指定为gorm.Model,并将World结构转储为[]byte类型。

代码语言:javascript
复制
import (
    "encoding/json"
    "fmt"
    
    "gorm.io/datatypes"
)

type Huygens struct {
    gorm.Model
    Worlds datatypes.JSON
}

type World struct {
    Diameter int
    Name string
}

world := World{Diameter: 3, Name: Earth}
b, err := json.Marshal(world)
if err != nil {
    fmt.Println("error:", err)
}

db.Create(&Huygens{Worlds: datatypes.JSON(b)})

你可以看到更多的here。

票数 0
EN

Stack Overflow用户

发布于 2021-08-27 10:41:52

另一种使模型更有用的方法是创建一个实现Scan/Value的类型,并在这些类型中从/Marshal解组到JSON:

代码语言:javascript
复制
type Huygens struct {
    Worlds WorldsMap `json:"worlds"`
}

type World struct {
    Diameter int
    Name string
}

type WorldsMap map[string]World

func (WorldsMap) GormDataType() string {
  return "JSONB"
}

func (w *WorldsMap) Scan(value interface{}) error {
    var bytes []byte
    switch v := value.(type) {
    case []byte:
        bytes = v
    case string:
        bytes = []byte(v)
    default:
        return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
    }
    err := json.Unmarshal(bytes, w)
    return err
}

func (w WorldsMap) Value() (driver.Value, error) {
    bytes, err := json.Marshal(s)
    return string(bytes), err
}

然后,您可以在代码中像使用映射一样使用Worlds字段,而不是笨拙的字节切片。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68944128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档