微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql model Jsonb格式存储 gorm2.0

type JSON json.RawMessage

// Scan scan value into Jsonb, implements sql.Scanner interface
func (j *JSON) Scan(value interface{}) error {
    bytes, ok := value.([]byte)
    if !ok {
        return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
    }

    result := json.RawMessage{}
    err := json.Unmarshal(bytes, &result)
    *j = JSON(result)
    return err
}

// Value return json value, implement driver.Valuer interface
func (j JSON) Value() (driver.Value, error) {
    if len(j) == 0 {
        return nil, nil
    }
    return json.RawMessage(j).MarshalJSON()
}

func (JSON) GormDBDataType(db *gorm.DB, field *schema.Field) string {
    // use field.Tag, field.TagSettings gets field's tags
    // checkout https://github.com/go-gorm/gorm/blob/master/schema/field.go for all options

    // returns different database type based on driver name
    switch db.Dialector.Name() {
    case "MysqL", "sqlite":
        return "JSON"
    case "postgres":
        return "JSONB"
    }
    return ""
}

// convert map[string]interface{} to JSON
func MapToJSON(m *map[string]interface{}) (JSON, error) {
    if m == nil {
        return nil, errors.New("map is nil")
    }
    bytes, err := json.Marshal(*m)
    if err != nil {
        return nil, err
    }
    return bytes, nil
}

// convert JSON to map[string]interface{}
func JSONToMap(j JSON) map[string]interface{} {
    if j == nil {
        return nil
    }
    var m map[string]interface{}
    err := json.Unmarshal(j, &m)
    if err != nil {
        return nil
    }
    return m
}

// convert JSON to json.RawMessage
func JSONToRawMessage(j JSON) json.RawMessage {
    if j == nil {
        return nil
    }
    return json.RawMessage(j)
}

//结构体引用

type XXX struct {
Data         JSON `json:"data"`          //数据
}

                
                                 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐