CodeGym /Corsi /SQL SELF /Aggiornamento dei dati negli oggetti JSON usando j...

Aggiornamento dei dati negli oggetti JSON usando jsonb_set() e jsonb_insert()

SQL SELF
Livello 33, Lezione 4
Disponibile

Allora, JSONB in PostgreSQL è uno strumento super potente per salvare strutture dati complesse e gerarchiche. Ma che succede se devi aggiornare un valore dentro una colonna JSONB? Tipo, cambiare il numero di telefono di un utente o aggiungere una nuova categoria in un array? Sembra facile, ma JSONB non è una tabella dove puoi cambiare direttamente il valore in una cella. Per aggiornare i dati in un oggetto JSON useremo delle funzioni speciali. Oggi i protagonisti sono:

  • jsonb_set(): per modificare o aggiungere un valore in un "percorso" specifico.
  • jsonb_insert(): per inserire un nuovo elemento in un array JSON.

Aggiornare i dati con jsonb_set()

La funzione jsonb_set() ti permette di cambiare una parte di un oggetto JSONB o aggiungere nuove chiavi e valori.

Sintassi generale

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — il nostro oggetto JSONB che vogliamo aggiornare.
  • path — array di stringhe che rappresenta il percorso verso la chiave che vuoi cambiare.
  • new_value — il valore che vuoi aggiungere o sostituire.
  • create_missing — parametro booleano (TRUE o FALSE) che indica se creare le chiavi mancanti.

Vediamo un esempio semplice. Immagina di avere una tabella users con una colonna profile di tipo JSONB, dove sono salvati i profili degli utenti. Uno degli utenti aggiorna il suo numero di telefono. Come lo facciamo?

-- Creiamo la tabella e aggiungiamo i dati
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

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

-- Aggiorniamo il numero di telefono
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- Controlliamo il risultato
SELECT profile FROM users WHERE id = 1;

Risultato:

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

Wow! Abbiamo cambiato il numero di telefono! Nota che il percorso verso la chiave si indica con un array di stringhe '{contact,phone}'.

Aggiungere una nuova chiave

Se la chiave che vuoi aggiornare non esiste, puoi usare il parametro create_missing = TRUE per crearla:

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

-- Controlliamo il risultato
SELECT profile FROM users WHERE id = 1;

Risultato:

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

Adesso abbiamo una nuova sezione con l'indirizzo. Comodo, vero?

Inserire dati con jsonb_insert()

La funzione jsonb_insert() serve per aggiungere elementi agli array dentro oggetti JSONB.

Sintassi generale

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — l'oggetto JSONB di destinazione.
  • path — array di stringhe che rappresenta il percorso verso l'array dove vuoi inserire gli elementi.
  • new_value — il valore che vuoi aggiungere.
  • insert_after — parametro booleano. Se FALSE, l'elemento viene inserito prima dell'indice indicato; se TRUE, dopo.

Facciamo un esempio. Supponiamo di avere una tabella dove nella colonna profile c'è la lista degli interessi dell'utente. Vogliamo aggiungere un nuovo interesse all'array:

-- Aggiungiamo dati per l'esempio
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["sport", "musica"]', TRUE)
WHERE id = 1;

-- Inseriamo il nuovo interesse "programmazione" all'inizio della lista
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"programmazione"', FALSE)
WHERE id = 1;

-- Controlliamo il risultato
SELECT profile FROM users WHERE id = 1;

Risultato:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlino"
  },
  "interests": [
    "programmazione",
    "sport",
    "musica"
  ]
}

Problemi comuni e come evitarli

Lavorare con jsonb_set() e jsonb_insert() può essere un po' tricky se non tieni conto di queste cose:

  1. Percorso verso la chiave sbagliato. Se indichi un percorso sbagliato o provi ad aggiornare un elemento che non esiste senza create_missing=TRUE, avrai un errore o non cambierà nulla. Controlla sempre la struttura del tuo JSON.
  2. Tipo di dato non corrispondente. Ricorda che new_value deve essere di tipo JSONB. Se vuoi inserire una stringa, mettila sempre tra doppi apici ('"valore"').
  3. Sovrascrittura dei dati. Se provi ad aggiornare un array senza usare le funzioni giuste, rischi di cancellare i dati vecchi. Usa jsonb_insert() per aggiungere nuovi elementi in modo sicuro.

Esempio di errore:

-- Errore: percorso sbagliato
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nuovo contatto"', FALSE)
WHERE id = 1;

Questo darà errore perché nell'oggetto profile non c'è la chiave contacts e create_missing è impostato su FALSE.

Come evitarlo:

-- Impostiamo create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nuovo contatto"', TRUE)
WHERE id = 1;

Dove si usa tutto questo nella vita reale?

Lavorare con JSONB non è solo divertente, è una skill fondamentale per un sacco di applicazioni moderne. Ecco qualche esempio reale:

  • Salvataggio delle impostazioni utente. JSONB è perfetto per strutture dati dinamiche, tipo le impostazioni delle app che possono essere diverse per ogni utente.
  • Integrazione con API esterne. JSONB è comodo per salvare dati grezzi da REST API che restituiscono oggetti JSON.
  • Analisi di big data. Le strutture JSON annidate ti permettono di lavorare con dati IoT, log o analytics.

Con questo si chiude la nostra introduzione all'aggiornamento degli oggetti JSON. Ora sai come inserire, aggiornare e aggiungere dati in JSONB, e anche come evitare gli errori più comuni. Nella prossima lezione vedrai come unire oggetti JSONB e lavorarci ancora più efficacemente!

2
Compito
SQL SELF, livello 33, lezione 4
Bloccato
Aggiornamento di un oggetto JSON usando `jsonb_set()`
Aggiornamento di un oggetto JSON usando `jsonb_set()`
1
Sondaggio/quiz
Elaborazione dei dati JSON, livello 33, lezione 4
Non disponibile
Elaborazione dei dati JSON
Elaborazione dei dati JSON
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION