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)
}