gorm存入数组(泛型)

之前写的gorm存入数组,每个类型都需要定义,这次使用泛型,并通过使用lancet库转为string存入数据库,可以存入不同类型

package main

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/duke-git/lancet/v2/convertor"
	"gorm.io/gorm"
)

type Array[T string | int32 | int8] []T

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

// 实现 driver.Valuer 接口,Value 返回 json value
func (a Array[T]) Value() (driver.Value, error) {
	if a == nil {
		return "[]", nil
	}
	return convertor.ToString(a), nil
}

var GDB *gorm.DB

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

func testArray() {
	type User struct {
		Id   int
		Name Array[int32]
	}
	GDB.AutoMigrate(&User{})
	user := User{
		Name: []int32{
			1,
			2,
		},
	}
	GDB.Create(&user)
	var fUser User
	GDB.Model(&user).Find(&fUser, user.Id)
	fmt.Printf("%#v\n", fUser)
	for _, a := range fUser.Name {
		fmt.Printf("%T %#v\n", a, a)
	}
}

posted @ 2022-07-24 14:43  burndust  阅读(1478)  评论(0)    收藏  举报