Alors, JSONB dans PostgreSQL, c'est un outil super puissant pour stocker des structures de données complexes et hiérarchiques. Mais si tu veux modifier une valeur à l'intérieur d'une colonne JSONB ? Genre, remplacer le numéro de téléphone d'un utilisateur ou ajouter une nouvelle catégorie dans un tableau ? Ça a l'air simple, mais JSONB, c'est pas une table où tu peux juste changer une valeur dans une cellule. Pour mettre à jour des données dans un objet JSON, on va utiliser des fonctions spéciales. Aujourd'hui, les stars du jour sont :
jsonb_set(): pour modifier ou ajouter une valeur à un "chemin" précis.jsonb_insert(): pour insérer un nouvel élément dans un tableau JSON.
Mise à jour des données avec jsonb_set()
La fonction jsonb_set() te permet de modifier une partie d'un objet JSONB ou d'y ajouter de nouvelles clés et valeurs.
Syntaxe générale
jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
target— notre objet JSONB à mettre à jour.path— un tableau de chaînes qui représente le chemin vers la clé à modifier.new_value— la valeur qu'on veut ajouter ou remplacer.create_missing— un booléen (TRUE ou FALSE) qui dit s'il faut créer les clés manquantes.
Regardons un exemple tout simple. Imagine qu'on a une table users avec une colonne profile de type JSONB, où on stocke les profils des utilisateurs. Un des utilisateurs veut changer son numéro de téléphone. Comment on fait ?
-- On crée la table et on ajoute des données
CREATE TABLE users (
id SERIAL PRIMARY KEY,
profile JSONB
);
INSERT INTO users (profile)
VALUES ('{"name": "Otto", "contact": {"phone": "+1-495-123-45-67"}}');
-- On met à jour le numéro de téléphone
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;
-- On vérifie le résultat
SELECT profile FROM users WHERE id = 1;
Résultat :
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
}
}
Wow ! On a changé le numéro de téléphone ! Remarque que le chemin vers la clé est donné comme un tableau de chaînes '{contact,phone}'.
Ajouter une nouvelle clé
Si la clé que tu veux modifier n'existe pas, tu peux utiliser le paramètre create_missing = TRUE pour la créer :
UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlin"', TRUE)
WHERE id = 1;
-- On vérifie le résultat
SELECT profile FROM users WHERE id = 1;
Résultat :
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlin"
}
}
Maintenant, on a une nouvelle section pour l'adresse. Pratique, non ?
Insertion de données avec jsonb_insert()
La fonction jsonb_insert() sert à ajouter des éléments dans des tableaux à l'intérieur d'objets JSONB.
Syntaxe générale
jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
target— l'objet JSONB cible.path— un tableau de chaînes qui indique le chemin vers le tableau où tu veux insérer des éléments.new_value— la valeur à ajouter.insert_after— un booléen. Si FALSE, l'élément est inséré avant l'index donné ; si TRUE, après.
Un exemple. Disons qu'on a une table où la colonne profile contient la liste des centres d'intérêt d'un utilisateur. On veut ajouter un nouveau centre d'intérêt dans le tableau :
-- On ajoute des données pour l'exemple
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["sport", "musique"]', TRUE)
WHERE id = 1;
-- On insère le nouvel intérêt "programmation" au début de la liste
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"programmation"', FALSE)
WHERE id = 1;
-- On vérifie le résultat
SELECT profile FROM users WHERE id = 1;
Résultat :
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlin"
},
"interests": [
"programmation",
"sport",
"musique"
]
}
Problèmes fréquents et comment les éviter
Travailler avec jsonb_set() et jsonb_insert() peut être un peu tricky si tu fais pas gaffe à ces points :
- Chemin vers la clé incorrect. Si tu donnes un mauvais chemin ou que tu essaies de modifier un élément qui existe pas sans
create_missing=TRUE, tu vas avoir une erreur ou rien ne va changer. Vérifie toujours la structure de ton JSON. - Type de données non conforme. Rappelle-toi que
new_valuedoit être de type JSONB. Si tu veux insérer une chaîne, mets-la bien entre doubles guillemets ('"valeur"'). - Écrasement de données. Si tu essaies de modifier un tableau sans utiliser les fonctions adaptées, tu risques d'effacer les anciennes données. Utilise
jsonb_insert()pour ajouter des éléments sans danger.
Exemple d'erreur :
-- Erreur : chemin incorrect
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nouveau contact"', FALSE)
WHERE id = 1;
Ça va générer une erreur parce que dans l'objet profile il n'y a pas de clé contacts, et create_missing est à FALSE.
Comment éviter :
-- On met create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nouveau contact"', TRUE)
WHERE id = 1;
Où ça sert dans la vraie vie ?
Bosser avec JSONB, c'est pas juste pour le fun, c'est une compétence clé pour plein d'applis modernes. Voilà quelques exemples concrets :
- Stockage des paramètres utilisateur. JSONB est parfait pour des structures de données dynamiques, genre les paramètres d'applis qui peuvent varier selon l'utilisateur.
- Intégration avec des API externes. JSONB est pratique pour stocker des données brutes venant d'API REST qui renvoient des objets JSON.
- Analyse de big data. Les structures imbriquées JSON permettent de bosser avec des données IoT, des logs ou de l'analytics.
Voilà, c'est la fin de notre petite intro à la mise à jour des objets JSON. Maintenant tu sais comment insérer, modifier et ajouter des données dans JSONB, et éviter les pièges classiques. Dans le prochain cours, tu verras comment fusionner des objets JSONB et bosser avec eux encore plus efficacement !
GO TO FULL VERSION