Update json field in postgres
Пользуюсь ORM GORM для работы с бд postgresql.
В таблице одно из полей содержит объект json и тип, в рамках postgres, у этого поля соответствующий - json.
Сейчас мне требуется обновить только часть этого объекта. Например json: {"key1":"value1", "key2":"value2", "key3":"value3"} и я хочу поменять только key2 установив ему значение value5 например.
Можно ли это делать с помощью GORM? И если да, то как это делается?
Я знаю, что можно достать весь объект, распаковать json в структуру, поменять нужно поле, запаковать обратно и положить обратно в таблицу. Но выглядит это довольно громоздко. Смотрел в доках GORM и что-то не разобрался можно ли с его помощью такое провернуть.
Ответы (1 шт):
Необязательно полностью распаковывать объект и упаковывать обратно.
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)))
}