У меня есть такая модель в
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"`
}
Я хочу вставить FieldNameOfJsonb как array of object
в postgres, используя GORM
Как указано ниже
{
"name": " james",
"email": "[email protected]",
"FieldNameOfJsonb": [
{
"someField1": "value",
"someFiedl2": "somevalue",
},
{
"Field1": "value1",
"Fiedl2": "value2",
}
],
Просто добавьте этот код ниже в Model.go (ссылкаСсылка)
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)
}
-> ссылка Ссылка для Маршал , Размаршал
DB.Create(&yourTableName)
очевидно, мы можем изменить в соответствии с нашим требованием
Вы можете использовать пакет gorm-jsonb.
Я ответил на аналогичный вопрос в https://stackoverflow.com/a/71636216/13719636.
Самый простой способ использовать JSONB в Gorm — использовать pgtype.JSONB
.
Gorm использует pgx
в качестве драйвера, а pgx
имеет пакет с именем pgtype
, который имеет тип с именем pgtype.JSONB
.
Если вы уже установили 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)
дснт вок для меня
К сожалению, у меня тоже не работает
любое рабочее решение для этого?
Метаданные pgtype.JSONB json:"-" gorm:"column:metadata"
помогают .. «type:jsonb» вызывал у меня проблемы .. удалите его, и все заработает :)
спасибо, это сработало для меня, мой тип был частью int и использовал тот же код, что и выше
Я бы изменил тип на:
type JSONB map[string]interface{}