golang_gorm_设置mysql为json字段类型2023-04-11

package main

import (
    "database/sql/driver"
    "encoding/json"
    "errors"
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type JSON json.RawMessage

// 实现 sql.Scanner 接口,Scan 将 value 扫描至 Jsonb
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
}

// 实现 driver.Valuer 接口,Value 返回 json value
func (j JSON) Value() (driver.Value, error) {
    if len(j) == 0 {
        return nil, nil
    }
    return json.RawMessage(j).MarshalJSON()
}

type Product struct {
    gorm.Model
    A JSON `gorm:"type:json"`
}

func (Product) TableName() string {
    return "student_Product"
}

func test_orm() {
    dsn := "root:Admin123@tcp(127.0.0.1:3390)/abc?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

    if err != nil {
        panic(err)
    }
    db.AutoMigrate(&Product{})

}

func main() {
    test_orm()
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容