如何将字符串转换为 sqlx.types.JSONText?

我正在使用gqlgen,sqlx和pgx. 尝试使用自定义标量在 postgres 数据库中存储为 jonb 类型。


// graph/model/item.go


type Attributes types.JSONText


// Marshal here

...


func (a *Attributes) UnmarshalGQL(v interface{}) error {

    switch v := v.(type) {

    case []byte:

        log.Println(" >> unmarshal.byte:", v)

        json.Unmarshal(v, &a)

        return nil

    case string:

        log.Println(" >> unmarshal.string:", v) // >> unmarshal.string: {"target": "localhost"}


        json.Unmarshal([]byte(v), a) // This gives `null` in postgres


        log.Println(" >> unmarshal.aT:", reflect.TypeOf(a)) // >> unmarshal.aT: *model.Attributes

        log.Println(" >> unmarshal.aV:", reflect.ValueOf(a)) // >> unmarshal.aV: &[]


        return nil

    default:

        return errors.New(fmt.Sprintf("Unsupported type: %T", v))

    }

}

的期望结果a *Attributes应该是{"target": "localhost"},在 postgres 中存储为 jsonb:


| id | quantity | attributes              |

|----|----------|-------------------------|

| 1  | 5        | {"target": "localhost"} |

我做错了什么?


编辑:添加样本突变。


这是样本突变:


mutation itemCreate {

  itemCreate(input: {

    quantity: 5,

    attributes: "{\"target\": \"localhost\"}"

  })

}

编辑:添加 sqlx 查询。


要插入的查询:


func (d *ItemDb) ItemCreate(i *model.ItemInput) (*model.Item, error) {


    log.Println(" >> i.Attributes:", i.Attributes) // >> i.Attributes: &[123 34 116 97 114 103 101 116 34 58 32 34 108 111 99 97 108 104 111 115 116 34 125]


    item := &model.Item{}


    if err := d.Get(item, `INSERT INTO items

    (quantity, attributes)

    VALUES ($1, $2)

    RETURNING *`, i.Quantity, i.Attributes); err != nil {

        return nil, err

    }


    return item, nil

}


天涯尽头无女友
浏览 84回答 1
1回答

阿波罗的战车

如果v在其中包含文字 json ,[]byte则string不需要 for json.Unmarshal,只需要转换即可。func (a *Attributes) UnmarshalGQL(v interface{}) error {    switch v := v.(type) {    case []byte:        *a = Attributes(v)    case string:        *a = Attributes(v)    default:        return errors.New(fmt.Sprintf("Unsupported type: %T", v))    }    return nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go