Отже, 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-об'єкти та працювати з ними ще ефективніше!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ