Modification de données JSON dans SQLite
Introduction
Après avoir stocké et interrogé des données JSON dans SQLite, vous aurez probablement besoin de les modifier. SQLite offre plusieurs fonctions pour mettre à jour, ajouter ou supprimer des éléments dans vos structures JSON sans avoir à réécrire l’intégralité du document.
Les fonctions de modification JSON
SQLite propose trois fonctions principales pour modifier des données JSON :
json_set()- Remplace les valeurs existantes ou ajoute de nouveaux éléments s’ils n’existent pasjson_insert()- Ajoute de nouveaux éléments uniquement si les chemins spécifiés n’existent pas déjàjson_remove()- Supprime des éléments aux chemins spécifiés
Modification avec json_set()
La fonction json_set() est la plus polyvalente, car elle permet à la fois de modifier des valeurs existantes et d’ajouter de nouveaux éléments.
Syntaxe de base
json_set(json, path1, value1, path2, value2, ...)Exemples d’utilisation
Considérons cette table d’utilisateurs avec des profils JSON :
CREATE TABLE utilisateurs (    id INTEGER PRIMARY KEY,    profil TEXT NOT NULL);
INSERT INTO utilisateurs (profil) VALUES('{"nom":"Alice", "age":28, "email":"[email protected]", "adresse":{"ville":"Paris", "code_postal":"75001"}}');Modifier une valeur simple
-- Mettre à jour l'âge d'AliceUPDATE utilisateursSET profil = json_set(profil, '$.age', 29)WHERE json_extract(profil, '$.nom') = 'Alice';Modifier plusieurs valeurs à la fois
-- Mettre à jour l'âge et l'email simultanémentUPDATE utilisateursSET profil = json_set(profil,                     '$.age', 30,WHERE id = 1;Modifier une valeur imbriquée
-- Mettre à jour le code postal dans l'objet adresseUPDATE utilisateursSET profil = json_set(profil, '$.adresse.code_postal', '75002')WHERE id = 1;Ajouter un nouvel élément
-- Ajouter un numéro de téléphoneUPDATE utilisateursSET profil = json_set(profil, '$.telephone', '+33123456789')WHERE id = 1;Ajouter un objet imbriqué
-- Ajouter des préférences sous forme d'objetUPDATE utilisateursSET profil = json_set(profil,                     '$.preferences',                     json_object('theme', 'sombre', 'notifications', 'activées'))WHERE id = 1;Ajout conditionnel avec json_insert()
Contrairement à json_set(), la fonction json_insert() n’écrase pas les valeurs existantes. Elle ajoute uniquement de nouveaux éléments si les chemins spécifiés n’existent pas déjà.
Syntaxe
json_insert(json, path1, value1, path2, value2, ...)Exemples
-- Tenter d'ajouter un numéro de téléphone et de modifier l'âgeUPDATE utilisateursSET profil = json_insert(profil,                        '$.telephone', '+33987654321',                        '$.age', 40)WHERE id = 1;Dans cet exemple :
- Si 
$.telephonen’existe pas, il sera ajouté avec la valeur spécifiée - Si 
$.ageexiste déjà (ce qui est le cas), sa valeur ne changera pas 
C’est utile lorsque vous voulez ajouter des champs sans risquer d’écraser des données existantes.
Suppression d’éléments avec json_remove()
Pour supprimer des éléments d’un objet JSON, utilisez la fonction json_remove().
Syntaxe
json_remove(json, path1, path2, ...)Exemples
-- Supprimer le champ emailUPDATE utilisateursSET profil = json_remove(profil, '$.email')WHERE id = 1;-- Supprimer plusieurs champs à la foisUPDATE utilisateursSET profil = json_remove(profil, '$.telephone', '$.preferences.notifications')WHERE id = 1;Dans le deuxième exemple, nous supprimons à la fois le champ telephone et le champ notifications à l’intérieur de l’objet preferences.
Combiner plusieurs opérations
Vous pouvez enchaîner les fonctions JSON pour effectuer des opérations complexes :
-- Enchaînement de plusieurs opérationsUPDATE utilisateursSET profil = json_set(                json_remove(profil, '$.preferences.theme'),                '$.preferences.langue', 'fr',                '$.derniere_connexion', datetime('now')             )WHERE id = 1;Cette requête :
- Supprime le champ 
themedes préférences - Ajoute un champ 
languedans les préférences - Ajoute un horodatage de dernière connexion
 
Travailler avec des tableaux JSON
Ajouter des éléments à un tableau
Pour ajouter un élément à un tableau existant, vous devez extraire le tableau, le modifier, puis le réinsérer :
-- Ajouter un intérêt à un tableau d'intérêtsUPDATE utilisateursSET profil = json_set(                profil,                '$.interets',                json_array(                    SELECT value FROM json_each(json_extract(profil, '$.interets'))                    UNION ALL                    SELECT 'photographie'                )             )WHERE id = 1 AND json_type(profil, '$.interets') = 'array';Supprimer un élément d’un tableau
Pour supprimer un élément d’un tableau, vous pouvez utiliser une approche similaire :
-- Supprimer 'musique' des intérêtsUPDATE utilisateursSET profil = json_set(                profil,                '$.interets',                json_array(                    SELECT value FROM json_each(json_extract(profil, '$.interets'))                    WHERE value != 'musique'                )             )WHERE id = 1 AND json_type(profil, '$.interets') = 'array';La fonction json_patch()
SQLite propose également la fonction json_patch() qui applique des modifications selon les spécifications du RFC 7396 pour JSON Patch.
Syntaxe
json_patch(target_json, patch_json)Exemple
-- Appliquer un patch à un profilUPDATE utilisateursSET profil = json_patch(                profil,                '{"age": 32, "adresse": {"ville": "Lyon"}, "preferences": null}'             )WHERE id = 1;Ce patch fait trois modifications :
- Met à jour l’âge à 32
 - Change la ville à Lyon (mais conserve les autres propriétés de l’adresse comme le code postal)
 - Supprime complètement l’objet preferences (en le remplaçant par null)
 
Exemple complet : Système de gestion d’inventaire
Voici un exemple plus complet qui démontre comment utiliser les fonctions de modification JSON dans un système d’inventaire :
-- Créer une table d'inventaireCREATE TABLE produits (    id INTEGER PRIMARY KEY,    details TEXT NOT NULL);
-- Insérer un produit initialINSERT INTO produits (details) VALUES('{"nom":"Smartphone XYZ", "prix":499.99, "caracteristiques":["Écran 6.5\"", "128 Go"], "stock":{"entrepot_A":45, "entrepot_B":32}}');
-- 1. Mettre à jour le prixUPDATE produitsSET details = json_set(details, '$.prix', 449.99)WHERE json_extract(details, '$.nom') = 'Smartphone XYZ';
-- 2. Ajouter une nouvelle caractéristiqueUPDATE produitsSET details = json_set(                details,                '$.caracteristiques',                json_array(                    SELECT value FROM json_each(json_extract(details, '$.caracteristiques'))                    UNION ALL                    SELECT 'Batterie 5000mAh'                )             )WHERE id = 1;
-- 3. Diminuer le stock après une venteUPDATE produitsSET details = json_set(                details,                '$.stock.entrepot_A',                CAST(json_extract(details, '$.stock.entrepot_A') AS INTEGER) - 5             )WHERE id = 1;
-- 4. Ajouter un nouveau champ pour la date de dernière mise à jourUPDATE produitsSET details = json_set(details, '$.derniere_mise_a_jour', datetime('now'))WHERE id = 1;
-- 5. Marquer comme indisponible si le stock total est épuiséUPDATE produitsSET details = json_set(                details,                '$.disponible',                (CAST(json_extract(details, '$.stock.entrepot_A') AS INTEGER) +                 CAST(json_extract(details, '$.stock.entrepot_B') AS INTEGER)) > 0             )WHERE id = 1;Cet exemple démontre une séquence d’opérations typiques pour la gestion d’un inventaire :
- Mise à jour du prix
 - Ajout d’une caractéristique
 - Ajustement du stock
 - Ajout d’un horodatage de mise à jour
 - Détermination automatique de la disponibilité
 
Validation après modification
Il est important de vérifier que vos opérations de modification produisent toujours du JSON valide :
-- Vérifier la validité après une mise à jourUPDATE utilisateursSET profil =    CASE        WHEN json_valid(json_set(profil, '$.age', 'trente')) THEN json_set(profil, '$.age', 'trente')        ELSE profil    ENDWHERE id = 1;Bien que cet exemple spécifique produise du JSON valide, c’est une bonne pratique de vérifier la validité lors de modifications complexes.
Bonnes pratiques
- 
Utiliser les fonctions appropriées :
json_set()pour mettre à jour ou ajouter des champsjson_insert()pour ajouter uniquement des champs manquantsjson_remove()pour supprimer des champs
 - 
Transactions : Encapsulées les modifications complexes dans des transactions.
 - 
Vérifier le type : Utilisez
json_type()pour vérifier le type des champs avant de les modifier. - 
Contrôle de validation : Utilisez
json_valid()pour vous assurer que vos modifications produisent un JSON valide. - 
Minimiser les mises à jour : Essayez de combiner plusieurs modifications en une seule mise à jour pour de meilleures performances.
 
Prochaines étapes
Maintenant que vous savez modifier des données JSON, vous pouvez explorer les fonctions d’agrégation JSON pour travailler avec des collections de données.