我正在使用gqlgen,sqlx和pgx. 尝试使用自定义标量在 postgres 数据库中存储为 jonb 类型。// graph/model/item.gotype 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}
1 回答
阿波罗的战车
TA贡献1862条经验 获得超6个赞
如果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
}
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报
0/150
提交
取消