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:
- 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. - Tipo di dato non corrispondente. Ricorda che
new_valuedeve essere di tipo JSONB. Se vuoi inserire una stringa, mettila sempre tra doppi apici ('"valore"'). - 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!
GO TO FULL VERSION