让GORM框架支持Json

截止至目前(2021年8月15日),GORM框架默认仍然是不支持json的,但是,GORM 提供了少量接口,使用户能够为 GORM 定义支持的数据类型,与此同时,GORM官方也有一个仓库,用于收集各种自定义的数据类型:https://github.com/go-gorm/datatypes ,本文所用到的,正是这个仓库。其实仓库里的demo已经写得很好了,但是我还是按赖不住激动,要记录一下。当然,本文也是参考仓库里的demo的。

代码部分

准备

首先获取该模块

go get gorm.io/datatypes

引入模块

import "gorm.io/datatypes"

创建模型

type UserWithJSON struct {
    gorm.Model
    Name       string
    Attributes datatypes.JSON
}

使用的json是demo里面的json

{
    "name": "jinzhu",
    "age": 18,
    "tags": ["tag1", "tag2"],
    "orgs": {
        "orga": "orga"
    }
}

CRUD

C

//demo的写法
db.Create(&User{
    Name:       "json-1",
    Attributes: datatypes.JSON([]byte(`{"name": "jinzhu", "age": 18, "tags": ["tag1", "tag2"], "orgs": {"orga": "orga"}}`)),
})
//提供了另一种写法
db.Create(&User{
    Name:       "json-1",
    Attributes: datatypes.JSON("{\"name\":\"jinzhu\",\"age\":18,\"tags\":[\"tag1\",\"tag2\"],\"orgs\":{\"orga\":\"orga\"}}"),
})

R

db.Find(&user, datatypes.JSONQuery("attributes").HasKey("role"))
db.Find(&user, datatypes.JSONQuery("attributes").HasKey("orgs", "orga"))
db.First(&user, datatypes.JSONQuery("attributes").Equals("jinzhu", "name"))
db.First(&user, datatypes.JSONQuery("attributes").Equals("orgb", "orgs", "orgb"))

UD就是GORM的方法不多赘述

demo

package main

import (
    "fmt"
    "gorm.io/datatypes"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    gorm.Model
    Name       string
    Attributes datatypes.JSON
}

func main() {
    dsn := fmt.Sprintf("root:root@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local")
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        return
    }
    db.AutoMigrate(&User{})
    db.Create(&User{
        Name:       "json-1",
        Attributes: datatypes.JSON("{\"name\":\"jinzhu\",\"age\":18,\"tags\":[\"tag1\",\"tag2\"],\"orgs\":{\"orga\":\"orga\"}}"),
    })
    u := new(User)
    db.Find(&u, datatypes.JSONQuery("attributes").HasKey("name"))
    fmt.Println(u.Name)
    db.Find(&u, datatypes.JSONQuery("attributes").HasKey("orgs", "orga"))
    fmt.Println(u.Name)
    db.First(&u, datatypes.JSONQuery("attributes").Equals("jinzhu", "name"))
    fmt.Println(u.Name)
    db.First(&u, datatypes.JSONQuery("attributes").Equals("orgb", "orgs", "orgb"))
    fmt.Println(u.Name)
}
最后修改:2021 年 08 月 15 日
如果觉得我的文章对你有用,请随意赞赏