如何将字符串转换为 sqlx.types.JSONText?
How to convert string to 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 (, )
RETURNING *`, i.Quantity, i.Attributes); err != nil {
return nil, err
}
return item, nil
}
如果 v
在 []byte
或 string
中包含文字 json 那么就不需要 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
}
我正在使用 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 (, )
RETURNING *`, i.Quantity, i.Attributes); err != nil {
return nil, err
}
return item, nil
}
如果 v
在 []byte
或 string
中包含文字 json 那么就不需要 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
}