为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 golang 地图插入 PostgreSQL

如何将 golang 地图插入 PostgreSQL

Go
慕容森 2022-06-13 10:20:50
我有一个从移动应用程序发送的 json 对象,如下所示:{    "product_id": "0123456789",    "name": "PRODUCT_NAME",    "manufacturer": "PRODUCT_MANUFACTURER",    "image_url": "IMAGE_URL",    "additional_info": "",    "store_id": "STORE_ID",    "store_name": "STORE_NAME",    "owner_id": "OWNER_ID",    "quantities": {        "1000": 10.0,        "1500": 12.0,    }}中的键值quantities是a,例如可以是克,值是a代表价格。因此,例如,1000 克大米将花费 10 美元,而 1500 克大米将花费 12.0 美元(作为销售或其他东西)我的Go代码中有一个模型对象,quantities当map[int]float32 我试图找到一种方法将此地图插入到PostgreSQL我拥有的数据库中时,它具有该文件,但无法弄清楚如何。这是我的Go模型:type Product struct {    ID             string              UUID           string              Name           string             Manufacturer   string             ImageURL       string             AdditionalInfo string              StoreID        string             StoreName      string              OwnerID        string              Quantities     map[int]float32}我读过但是当我检索数据时JSONB它不会返回吗?json我需要它返回 amap[int]float32而不是json。
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您需要实现driver.Valuer和sql.Scanner接口以保存为 JSONB


接口,以便将driver.Valuer对象编组为数据库可以理解的 JSON 字节切片。


sql.Scanner接口,这样它将数据库中的 JSON 字节切片解组到结构字段中。


而对于 json Marshal 你需要转换map[int]float32成map[string]float32


type cusjsonb map[int]float32


// Returns the JSON-encoded representation

func (a cusjsonb) Value() (driver.Value, error) {

    // Convert to map[string]float32 from map[int]float32 

    x := make(map[string]float32)

    for k, v := range a {

       x[strconv.FormatInt(int64(k), 10)] = v

    }

    // Marshal into json 

    return json.Marshal(x)

}


// Decodes a JSON-encoded value

func (a *cusjsonb) Scan(value interface{}) error {

    b, ok := value.([]byte)

    if !ok {

        return errors.New("type assertion to []byte failed")

    }

    // Unmarshal from json to map[string]float32

    x := make(map[string]float32)

    if err := json.Unmarshal(b, &x); err != nil {

       return err

    }

    // Convert to map[int]float32 from  map[string]float32

    *a = make(cusjsonb, len(x))

    for k, v := range x {

      if ki, err := strconv.ParseInt(k, 10, 32); err != nil {

         return err

      } else {

         (*a)[int(ki)] = v

      }

    }

    return nil

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号