【问题标题】:How to insert Data in JSONB Field of Postgres using GORM如何使用 GORM 在 Postgres 的 JSONB 字段中插入数据
【发布时间】:2022-03-27 20:18:12
【问题描述】:

我有这样的模型

  • 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",
        }
    ],

【问题讨论】:

    标签: postgresql go go-gorm


    【解决方案1】:

    只需在 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) 插入数据

    【讨论】:

      【解决方案2】:

      我已经在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"`
      }
      

      从数据库中获取价值

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

      为数据库设置值

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

      【讨论】:

        【解决方案3】:

        您可以使用gorm-jsonb 包。

        【讨论】:

          猜你喜欢
          • 2020-05-26
          • 2020-05-22
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          • 2015-10-06
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          相关资源
          最近更新 更多