CodeGym /Kursy /SQL SELF /Aktualizacja danych w obiektach JSON z użyciem jsonb_set...

Aktualizacja danych w obiektach JSON z użyciem jsonb_set() i jsonb_insert()

SQL SELF
Poziom 33, Lekcja 4
Dostępny

No więc, JSONB w PostgreSQL to potężne narzędzie do przechowywania złożonych, hierarchicznych struktur danych. Ale co, jeśli musisz zaktualizować wartość wewnątrz kolumny JSONB? Na przykład podmienić numer telefonu użytkownika albo dodać nową kategorię do tablicy? Brzmi prosto, ale JSONB to nie tabela, gdzie możesz bezpośrednio zmienić wartość w jednej komórce. Do aktualizacji danych w obiekcie JSON użyjemy specjalnych funkcji. Dziś głównymi bohaterami będą:

  • jsonb_set(): do zmiany lub dodania wartości pod wskazaną "ścieżką".
  • jsonb_insert(): do wstawiania nowego elementu do tablicy JSON.

Aktualizacja danych z jsonb_set()

Funkcja jsonb_set() pozwala zmienić część obiektu JSONB albo dodać do niego nowe klucze i wartości.

Ogólna składnia

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — nasz obiekt JSONB, który chcemy zaktualizować.
  • path — tablica stringów, która reprezentuje ścieżkę do klucza, który chcemy zmienić.
  • new_value — wartość, którą chcemy dodać lub podmienić.
  • create_missing — parametr logiczny (TRUE albo FALSE), który mówi, czy tworzyć brakujące klucze.

Sprawdźmy najprostszy przykład. Wyobraź sobie, że mamy tabelę users z kolumną profile typu JSONB, gdzie trzymamy profile użytkowników. Jeden z użytkowników zmienia swój numer telefonu. Jak to ogarnąć?

-- Tworzymy tabelę i dodajemy dane
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

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

-- Aktualizujemy numer telefonu
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- Sprawdzamy wynik
SELECT profile FROM users WHERE id = 1;

Wynik:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

No i mamy to! Zmieniliśmy numer telefonu! Zwróć uwagę, że ścieżka do klucza podawana jest jako tablica stringów '{contact,phone}'.

Dodawanie nowego klucza

Jeśli klucz, który chcesz zaktualizować, nie istnieje, możesz użyć parametru create_missing = TRUE, żeby go stworzyć:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlin"', TRUE)
WHERE id = 1;

-- Sprawdzamy wynik
SELECT profile FROM users WHERE id = 1;

Wynik:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlin"
  }
}

Teraz mamy nową sekcję z adresem. Wygodne, nie?

Wstawianie danych z jsonb_insert()

Funkcja jsonb_insert() służy do dodawania elementów do tablic wewnątrz obiektów JSONB.

Ogólna składnia

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — docelowy obiekt JSONB.
  • path — tablica stringów, która wskazuje ścieżkę do tablicy, do której chcesz dodać elementy.
  • new_value — wartość, którą chcesz dodać.
  • insert_after — parametr logiczny. Jeśli FALSE, element zostanie wstawiony przed wskazanym indeksem; jeśli TRUE — po.

Przykład. Załóżmy, że mamy tabelę, gdzie w kolumnie profile trzymamy listę zainteresowań użytkownika. Chcemy dodać nowe zainteresowanie do tablicy:

-- Dodajemy dane do przykładu
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["sport", "muzyka"]', TRUE)
WHERE id = 1;

-- Wstawiamy nowe zainteresowanie "programowanie" na początek listy
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"programowanie"', FALSE)
WHERE id = 1;

-- Sprawdzamy wynik
SELECT profile FROM users WHERE id = 1;

Wynik:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlin"
  },
  "interests": [
    "programowanie",
    "sport",
    "muzyka"
  ]
}

Typowe problemy i jak ich unikać

Praca z jsonb_set() i jsonb_insert() może być trochę tricky, jeśli nie zwrócisz uwagi na kilka rzeczy:

  1. Zła ścieżka do klucza. Jeśli podasz złą ścieżkę albo spróbujesz zaktualizować nieistniejący element bez create_missing=TRUE, dostaniesz błąd albo nic się nie zmieni. Zawsze sprawdzaj strukturę swojego JSON-a.
  2. Niezgodność typów danych. Pamiętaj, że new_value musi być typu JSONB. Jeśli chcesz wstawić stringa, koniecznie zamknij go w podwójnych cudzysłowach ('"wartość"').
  3. Nadpisanie danych. Jeśli próbujesz zaktualizować tablicę bez użycia odpowiednich funkcji, możesz przypadkowo wyczyścić stare dane. Używaj jsonb_insert() do bezpiecznego dodawania nowych elementów.

Przykład błędu:

-- Błąd: zła ścieżka
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nowy kontakt"', FALSE)
WHERE id = 1;

To wywoła błąd, bo w obiekcie profile nie ma klucza contacts, a create_missing jest ustawione na FALSE.

Jak tego uniknąć:

-- Ustawiamy create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nowy kontakt"', TRUE)
WHERE id = 1;

Gdzie to się przydaje w prawdziwym życiu?

Praca z JSONB to nie tylko zabawa, to mega ważna umiejętność w wielu nowoczesnych aplikacjach. Oto kilka realnych przykładów:

  • Przechowywanie ustawień użytkownika. JSONB idealnie nadaje się do dynamicznych struktur danych, takich jak ustawienia aplikacji, które mogą się różnić u różnych userów.
  • Integracja z zewnętrznymi API. JSONB jest wygodny do przechowywania surowych danych z REST API, które zwracają obiekty JSON.
  • Analiza big data. Zagnieżdżone struktury JSON pozwalają pracować z danymi IoT, logami czy analityką.

Na tym kończymy nasz wstęp do aktualizacji obiektów JSON. Teraz już wiesz, jak wstawiać, aktualizować i dodawać dane do JSONB oraz jak unikać typowych błędów. W następnej lekcji dowiesz się, jak łączyć obiekty JSONB i pracować z nimi jeszcze efektywniej!

2
Zadanie
SQL SELF, poziom 33, lekcja 4
Niedostępne
Aktualizacja obiektu JSON za pomocą `jsonb_set()`
Aktualizacja obiektu JSON za pomocą `jsonb_set()`
1
Ankieta/quiz
Obsługa danych JSON, poziom 33, lekcja 4
Niedostępny
Obsługa danych JSON
Obsługa danych JSON
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION