Update json field in postgres

Пользуюсь ORM GORM для работы с бд postgresql.

В таблице одно из полей содержит объект json и тип, в рамках postgres, у этого поля соответствующий - json.

Сейчас мне требуется обновить только часть этого объекта. Например json: {"key1":"value1", "key2":"value2", "key3":"value3"} и я хочу поменять только key2 установив ему значение value5 например.

Можно ли это делать с помощью GORM? И если да, то как это делается?

Я знаю, что можно достать весь объект, распаковать json в структуру, поменять нужно поле, запаковать обратно и положить обратно в таблицу. Но выглядит это довольно громоздко. Смотрел в доках GORM и что-то не разобрался можно ли с его помощью такое провернуть.


Ответы (1 шт):

Автор решения: kurakinvit

Необязательно полностью распаковывать объект и упаковывать обратно.

type YourModel struct {
    ID   uint
    JSON json.RawMessage `gorm:"column:__json_column__"`
}

Сейчас нет возможности проверить, попробуй так:

func UpdateKey() {
    var yourModel YourModel
    db.Model(&yourModel).Where("id = ?", __ID__).UpdateColumn("json", gorm.Expr("jsonb_set(json, '{key2}', ?::jsonb)", `{"key2": "value5"}`))
}

json_column - название столбца, где лежит json.

ID - Id записи

UPDATE: Изменил функцию UpdateKey, чтобы принимала параметр:

func UpdateKey(value string) {
    var yourModel YourModel
    db.Model(&yourModel).Where("id = ?", __ID__).UpdateColumn("json", gorm.Expr("jsonb_set(json, '{key2}', ?::jsonb)", fmt.Sprintf(`{"key2": "%s"}`, value)))
}
→ Ссылка