Итак, 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() может быть немного хитрой, если не учитывать следующие моменты:
- Неправильный путь к ключу. Если вы укажете неверный путь или попробуете обновить несуществующий элемент без
create_missing=TRUE, вы получите ошибку или ничего не измените. Всегда проверяйте структуру вашего JSON. - Несоответствие типов данных. Помните, что
new_valueдолжно быть типа JSONB. Если вы хотите вставить строку, обязательно заключайте её в двойные кавычки ('"значение"'). - Перезапись данных. Если вы пытаетесь обновить массив без использования аккуратных функций, вы можете случайно стереть старые данные. Используйте
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-объекты и работать с ними ещё более эффективно!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ