登录
首页 >  Golang >  Go问答

用 gorm 将 go 结构嵌套到另一个结构中

来源:stackoverflow

时间:2024-03-05 10:30:27 118浏览 收藏

一分耕耘,一分收获!既然都打开这篇《用 gorm 将 go 结构嵌套到另一个结构中》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我有一个名为 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
}

到这里,我们也就讲完了《用 gorm 将 go 结构嵌套到另一个结构中》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>