JavaRush /Курсы /SQL SELF /Обновление данных в JSON-объектах с использованием

Обновление данных в JSON-объектах с использованием jsonb_set() и jsonb_insert()

SQL SELF
33 уровень , 4 лекция
Открыта

Итак, JSONB в PostgreSQL — это мощный инструмент для хранения сложных иерархических структур данных. Но что, если вам нужно обновить значение внутри JSONB-колонки? Например, заменить телефонный номер пользователя или добавить новую категорию в массив? Звучит просто, но JSONB — это не таблица, где можно напрямую изменить значение в одной ячейке. Для обновления данных в JSON-объекте мы будем использовать специальные функции. Сегодня главными героями будут:

  • jsonb_set(): для изменения или добавления значения по указанному "пути".
  • jsonb_insert(): для вставки нового элемента в массив JSON.

Обновление данных с jsonb_set()

Функция jsonb_set() позволяет изменить часть JSONB-объекта или добавить в него новые ключи и значения.

Общий синтаксис

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — наш JSONB-объект, который нужно обновить.
  • path — массив строк, представляющий путь к ключу, который нужно изменить.
  • new_value — значение, которое мы хотим добавить или заменить.
  • create_missing — логический параметр (TRUE или FALSE), который указывает, нужно ли создавать недостающие ключи.

Давайте рассмотрим простейший пример. Представьте, что у нас есть таблица users с колонкой profile типа JSONB, где хранятся профили пользователей. Один из пользователей обновляет свой номер телефона. Как мы это сделаем?

-- Создаем таблицу и добавляем данные
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

INSERT INTO users (profile)
VALUES ('{"name": "Отто", "contact": {"phone": "+1-495-123-45-67"}}');

-- Обновим номер телефона
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- Проверим результат
SELECT profile FROM users WHERE id = 1;

Результат:

{
  "name": "Отто",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

Вау! Мы изменили номер телефона! Заметьте, путь к ключу указывается через массив строк '{contact,phone}'.

Добавление нового ключа

Если ключ, который вы хотите обновить, отсутствует, вы можете использовать параметр create_missing = TRUE, чтобы создать его:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Берлин"', TRUE)
WHERE id = 1;

-- Проверим результат
SELECT profile FROM users WHERE id = 1;

Результат:

{
  "name": "Отто",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Берлин"
  }
}

Теперь у нас появился новый раздел с адресом. Удобно, правда?

Вставка данных с jsonb_insert()

Функция jsonb_insert() используется для добавления элементов в массивы внутри JSONB-объектов.

Общий синтаксис

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — целевой JSONB-объект.
  • path — массив строк, представляющий путь к массиву, в который вы хотите вставить элементы.
  • new_value — значение, которое нужно добавить.
  • insert_after — логический параметр. Если FALSE, элемент будет вставлен перед указанным индексом; если TRUE — после.

Приведём пример. Допустим, у нас есть таблица, где в колонке profile хранится список интересов пользователя. Мы хотим добавить новый интерес в массив:

-- Добавим данные для примера
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["спорт", "музыка"]', TRUE)
WHERE id = 1;

-- Вставим новый интерес "программирование" в начало списка
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"программирование"', FALSE)
WHERE id = 1;

-- Проверим результат
SELECT profile FROM users WHERE id = 1;

Результат:

{
  "name": "Отто",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Берлин"
  },
  "interests": [
    "программирование",
    "спорт",
    "музыка"
  ]
}

Частые проблемы и как их избежать

Работа с jsonb_set() и jsonb_insert() может быть немного хитрой, если не учитывать следующие моменты:

  1. Неправильный путь к ключу. Если вы укажете неверный путь или попробуете обновить несуществующий элемент без create_missing=TRUE, вы получите ошибку или ничего не измените. Всегда проверяйте структуру вашего JSON.
  2. Несоответствие типов данных. Помните, что new_value должно быть типа JSONB. Если вы хотите вставить строку, обязательно заключайте её в двойные кавычки ('"значение"').
  3. Перезапись данных. Если вы пытаетесь обновить массив без использования аккуратных функций, вы можете случайно стереть старые данные. Используйте jsonb_insert() для безопасного добавления новых элементов.

Пример ошибки:

-- Ошибка: неверный путь
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"новый контакт"', FALSE)
WHERE id = 1;

Это вызовет ошибку, потому что в объекте profile нет ключа contacts, а create_missing указан как FALSE.

Как избежать:

-- Указываем create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"новый контакт"', TRUE)
WHERE id = 1;

Где это применяется в реальной жизни?

Работа с JSONB — это не просто забава, это важнейший навык для многих современных приложений. Вот несколько реальных примеров:

  • Хранение пользовательских настроек. JSONB идеально подходит для динамических структур данных, таких как настройки приложений, которые могут различаться у разных пользователей.
  • Интеграция с внешними API. JSONB удобен для хранения сырых данных из REST API, которые возвращают JSON-объекты.
  • Анализ больших данных. Вложенные структуры JSON позволяют работать с данными IoT, журналами или аналитикой.

На этом наш вводный экскурс в обновление JSON-объектов окончен. Теперь вы знаете, как вставлять, обновлять и добавлять данные в JSONB, а также избегать типичных ошибок. В следующей лекции вы узнаете, как объединять JSONB-объекты и работать с ними ещё более эффективно!

2
Задача
SQL SELF, 33 уровень, 4 лекция
Недоступна
Обновление JSON-объекта с помощью `jsonb_set()`
Обновление JSON-объекта с помощью `jsonb_set()`
1
Опрос
Обработка JSON-данных, 33 уровень, 4 лекция
Недоступен
Обработка JSON-данных
Обработка JSON-данных
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ