如何使用GORM在Postgres的JSONB字段中插入数据



我在中有这样的模型

  • model.go
type yourTableName struct {
Name             string `gorm:"type:varchar(50)" json:"name"`
Email            string `gorm:"type:varchar(50)" json:"email"`
FieldNameOfJsonb JSONB  `gorm:"type:jsonb" json:"fieldnameofjsonb"`
}
  • 我想使用GORM 在postgres中插入FieldNameOfJsonb作为array of object

  • 如下面给出的

{
"name": " james",
"email": "james@gmail.com",
"FieldNameOfJsonb": [
{
"someField1": "value",
"someFiedl2": "somevalue",    
},
{
"Field1": "value1",
"Fiedl2": "value2",
}
],

我在中回答了一个类似的问题https://stackoverflow.com/a/71636216/13719636。

在Gorm中使用JSONB最简单的方法是使用pgtype.JSONB

Gorm使用pgx作为它的驱动程序,pgx有一个名为pgtype的包,其类型为pgtype.JSONB

如果您已经按照Gorm的指示安装了pgx,则不需要安装任何其他软件包。

这种方法应该是最佳实践,因为它使用底层驱动程序,不需要自定义代码。

type User struct {
gorm.Model
Data pgtype.JSONB `gorm:"type:jsonb;default:'[]';not null"`
}

从DB 获取价值

u := User{}
db.find(&u)
var data []string
err := u.Data.AssignTo(&data)
if err != nil {
t.Fatal(err)
}

将值设置为DB

u := User{}
err := u.Data.Set([]string{"abc","def"})
if err != nil {
return
}
db.Updates(&u)

只需在Model.go(referenceLink(中添加以下代码


import (
"errors"
"database/sql/driver"
"encoding/json"
)
// JSONB Interface for JSONB Field of yourTableName Table
type JSONB []interface{}
// Value Marshal
func (a JSONB) Value() (driver.Value, error) {
return json.Marshal(a)
}
// Scan Unmarshal
func (a *JSONB) Scan(value interface{}) error {
b, ok := value.([]byte)
if !ok {
return errors.New("type assertion to []byte failed")
}
return json.Unmarshal(b,&a)
}

->Marshal、Unmarshal 的参考链接

  • 现在您可以使用DB.Create(&yourTableName)插入数据

您可以使用gorm-jsonb包。

相关内容

  • 没有找到相关文章

最新更新