gpt4 book ai didi

json - 将 go 结构嵌入到 gorm 中的另一个结构中

转载 作者:行者123 更新时间:2023-12-03 03:15:44 25 4
gpt4 key购买 nike

我有一个名为http_requests 的数据库表。我已经建模了以下结构来表示该表中的行。

type Map map[string]interface{}

type HTTPRequest struct {
ID int64 `json:"id" gorm:"id"`
RequestURL string `json:"request_url,omitempty" gorm:"request_url"`
RequestParams *RequestParams `json:"request_params,omitempty" gorm:"request_params"`
}


// RequestParams is another struct that holds params from body and URL query
type RequestParams struct {
FromBody Map `json:"body,omitempty"`
FromQuery Map `json:"query,omitempty"`
}

保存HTTPRequest的代码:

request  := &HTTPRequest{
RequestURL: "dummy/url",
RequestParams: &RequestParams{FromBody: Map{"param1": "value1"}},
}

if err := gorm.DB.Create(request).Error; err != nil {
return err
}

当我尝试保存此 HTTPRequest 时,会导致错误:

sql: Scan error on column index 9, name "request_params": unsupported Scan, storing driver.Value type []uint8 into type *RequestParams 

我希望有 request_params 列来存储 JSON,如下所示:

{"body":{"param1":"value1"}, "query": {"param2" : "value2"} }
or
{"body":{"param1":"value1"}}
or
{"query": {"param2" : "value2"} }

从数据库读取时,应该将其解析为 RequestParams 结构。

最佳答案

根据 @mkopriva 的建议,我为 RequestParams 类型实现了 Scan() 和 Value() 方法。请参阅下面的代码。


import (
"database/sql/driver"
"encoding/json"
"strings"
)

// Value converts RequestParams to a map
func (reqParams RequestParams) Value() (driver.Value, error) {
reqMap, err := reqParams.ToMap()

if err != nil {
return nil, err
}

return reqMap.ForceJSON(), nil
}

// Scan converts value to RequestParams
func (reqParams *RequestParams) Scan(value interface{}) error {
// set empty struct by default
*reqParams = RequestParams{}

if value == nil {
return nil
}

if s, ok := value.([]byte); ok {
d := json.NewDecoder(strings.NewReader(string(s)))
d.UseNumber()

rp := &RequestParams{}
if err := d.Decode(rp); err == nil {
*reqParams = *rp
}
}

return nil
}

关于json - 将 go 结构嵌入到 gorm 中的另一个结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57725309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com