我正在使用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
}