猿问

如何将 golang 地图插入 PostgreSQL

我有一个从移动应用程序发送的 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。


慕容森
浏览 118回答 1
1回答

湖上湖

您需要实现driver.Valuer和sql.Scanner接口以保存为 JSONB接口,以便将driver.Valuer对象编组为数据库可以理解的 JSON 字节切片。sql.Scanner接口,这样它将数据库中的 JSON 字节切片解组到结构字段中。而对于 json Marshal 你需要转换map[int]float32成map[string]float32type cusjsonb map[int]float32// Returns the JSON-encoded representationfunc (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 valuefunc (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}
随时随地看视频慕课网APP

相关分类

Go
我要回答