gorm实现存入数组或json

package main

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
	"gorm.io/gorm"
	"strings"
)

type JSON struct {
	Name string `json:"name"`
}

// 实现 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))
	}
	return json.Unmarshal(bytes, &j)
}

// 实现 driver.Valuer 接口,Value 返回 json value
func (j JSON) Value() (driver.Value, error) {
	str, err := json.Marshal(j)
	if err != nil {
		return nil, err
	}
	return string(str), nil
}

type Array []string

// 实现 sql.Scanner 接口,Scan 将 value 扫描至 Jsonb
func (a *Array) Scan(value interface{}) error {
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New(fmt.Sprint("Failed to scan Array value:", value))
	}
	*a = strings.Split(string(bytes), ",")
	return nil
}

// 实现 driver.Valuer 接口,Value 返回 json value
func (a Array) Value() (driver.Value, error) {
	if len(a) > 0 {
		var str string = a[0]
		for _, v := range a[1:] {
			str += "," + v
		}
		return str,nil
	} else {
		return "",nil
	}
}

var GDB *gorm.DB

func main() {
	GDB = getDB()
	//testJson()
	testArray()
}

func testJson() {
	type User struct {
		Name JSON
	}
	GDB.AutoMigrate(&User{})
	user := User{
		Name: JSON{
			Name: "lala",
		},
	}
	GDB.Create(&user)
	var fUser User
	GDB.Model(&user).Find(&fUser)
	fmt.Println(fUser)
}

func testArray() {
	type User struct {
		Name Array
	}
	GDB.AutoMigrate(&User{})
	user := User{
		Name: []string{
			"lala",
			"tata",
		},
	}
	GDB.Create(&user)
	var fUser User
	GDB.Model(&user).Find(&fUser)
	fmt.Println(fUser)
}

posted @ 2022-07-12 09:23  burndust  阅读(2352)  评论(0)    收藏  举报