Comment Maîtriser les Requêtes Avancées JSON dans SQLite

Dans l’article précédent, Apprendre les bases : Comment utiliser JSON dans SQLite, nous avons plongé dans les fonctions JSON essentielles de SQLite et leurs capacités. Nous avons exploré l’utilisation de JSON comme données non structurées dans une base de données SQLite. De manière cruciale, nous avons détaillé certaines des fonctions JSON nécessaires de SQLite, discutant de leur rôle dans le stockage et la récupération des données, suivies d’exemples pratiques de requêtes SQL. Cette compréhension de base de la façon de travailler avec des données JSON dans SQLite prépare la scène pour votre exploration avancée du sujet.

C’est parti!

Intégration des capacités SQL et NoSQL en maîtrisant pleinement la gestion des JSON dans SQLite

Développer vos connaissances sur les capacités de gestion des JSON de SQLite combine le meilleur de SQL et NoSQL, offrant une solution efficace et tout-en-un pour gérer des formats de données mixtes. Le support des données JSON dans SQLite transforme SQLite en une puissance pour les données non structurées, semblable à des bases de données comme MongoDB.

L’intégration avancée de JSON dans SQLite réunit la flexibilité de JSON et la robustesse de SQLite, idéale pour les applications actuelles axées sur les données. Les capacités JSON de SQLite font plus que simplement stocker et récupérer des données. Elles permettent des opérations similaires à SQL sur les données JSON, créant un pont entre la gestion des données structurées et non structurées.

Ce guide se concentre sur l’acquisition de vos compétences pratiques avec les fonctions JSON de SQLite à travers des exemples de requêtes SQL concrets. Chaque section vise à améliorer votre compréhension et à vous donner un avantage sur la manipulation de données JSON dans le monde réel avec SQLite.

À la fin, vous serez bien équipé avec l’ensemble des outils disponibles pour la gestion des données JSON dans SQLite pour aborder n’importe quelle structure de données JSON. Vous apprendrez à appliquer des index, à interroger avec des expressions de chemin, à filtrer, et même à valider des données – des tâches essentielles pour gérer des données dynamiques dans des environnements structurés en utilisant les fonctions JSON de SQLite.

1. Comment intégrer JSON dans SQLite

Les fonctions intégrées JSON de SQLite jouent un rôle crucial dans l’intégration de JSON et de SQLite. À partir de la version 3.38.0 de SQLite, sortie le 2022-02-22, les fonctions JSON sont incluses par défaut, alors qu’auparavant elles étaient une extension. Cela signifie qu’avant cette version, ces fonctions JSON dans SQLite étaient facultatives, alors qu’elles sont maintenant disponibles par défaut et peuvent être désactivées en paramétrant une option de compilation, au cas où vous auriez besoin de les désactiver.

Vous pouvez importer des données JSON dans SQLite en utilisant des requêtes SQL d’insertion simples. En alternative, vous pouvez également utiliser des outils tiers ou des techniques de scripting pour importer massivement de grandes ensembles de données JSON également. Pour extraire des données JSON, vous pouvez utiliser la fonction json_extract() qui récupère les valeurs associées à une clé spécifique d’une colonne de données JSON.

2. Utiliser les fonctions JSON de SQLite pour une décodification avancée de JSON et des requêtes SQL

Dans cette section, nous allons explorer les fonctions JSON avancées et leurs capacités dans SQLite, en utilisant des exemples de requêtes SQL pour chacune. Tout au long de cet article de blog, nous allons utiliser des données JSON générées de manière aléatoire, nommées movie, comme référence pour être utilisées comme données examinées :

A sample JSON file which is generated in Dadroit JSON Generator, and opened in Dadroit JSON Viewer

Vous pouvez insérer les données dans une table nommée movie avec un champ nommé data, et commencer à exécuter ces requêtes d’exemple à partir de maintenant contre elle. Dans les requêtes suivantes, nous allons utiliser les textes d’entrée des fonctions JSON, pour être clairs sur l’explication des fonctions, et ensuite nous reviendrons aux données insérées dans la base de données à partir de la section 3.

Pour simplifier cet exemple, nous allons utiliser une version plus simple de la première donnée JSON :

 

{
    "Name": "Naked of Truth",
    "Year": 1979,
    "Director": "Ellynn O'Brien",
    "Producer": "Kayley Byron Tutt",
    "Runtime": 183,
    "Rate": 8.0,
    "Description": "Donec pretium nec dolor in auctor."
}

Détection des erreurs avec la fonction json_error_position() dans SQLite

La fonction json_error_position() peut être utilisée pour détecter toute erreur dans la syntaxe de vos données JSON. Si la chaîne d’entrée est un JSON valide, elle retournera 0, sinon, elle retournera la position du caractère de la première erreur.

Par exemple, si vous avez une chaîne JSON cassée comme entrée de cette fonction comme ceci :

 

SELECT
    json_error_position ( '{"Name":"Naked of Truth","Year":1979,' ) AS err_position

Le résultat de l’exécution de cette requête serait la position de l’erreur de syntaxe qui s’est produite, qui dans ce cas est la position du « } » manquant à la fin :

error_position
38

Fusionner des Objets JSON avec la Fonction json_patch() dans SQLite

La fonction json_patch() fusionne deux objets JSON, permettant d’ajouter, de modifier et de supprimer des objets JSON.

Par exemple, cette requête combinerait les deux entrées JSON en un seul objet JSON:

 

SELECT
    json_patch ( '{"Name":"Naked of Truth"}', '{"Year": 2011}' ) AS patched_json;

Le résultat serait quelque chose comme ceci, un objet JSON construit à partir des deux champs:

patched_json
{« Name »: »Naked of Truth », »Year »:2011}

Manipuler les Champs JSON en Utilisant la Fonction json_set() dans SQLite

La fonction json_set() est utilisée pour ajouter ou remplacer des propriétés JSON. json_set() prend une chaîne JSON comme premier argument, suivie de zéro ou plusieurs paires d’arguments chemin/valeur. Le résultat serait une chaîne JSON créée à partir de l’ajout ou du remplacement de valeurs en fonction des paires de chemin et de valeur fournies.

Par exemple, en construisant sur les données JSON de la requête précédente, si vous souhaitez ajouter un champ Director aux données JSON, vous pouvez écrire une requête comme celle-ci:

 

SELECT
    json_set ( '{"Name":"Naked of Truth","Year":2011}', '$.Director', 'Ellynn OBrien' ) AS json_data;

Et le résultat serait quelque chose comme ceci:

json_data
{« Name »: »Naked of Truth », »Year »:2011, »Director »: »Ellynn OBrien »}

La Fonction json_quote() dans SQLite

La fonction json_quote() est simple, elle enveloppe simplement la valeur d’entrée avec des guillemets doubles pour en faire une chaîne JSON valide. Voici un exemple de requête simple pour cela:

 

SELECT
    json_quote ( 'Naked Of Truth' ) AS valid_json_string;

Et le résultat serait quelque chose comme ceci:

valid_json_string
« Naked of Truth »

Comment utiliser json_group_object() et json_group_array() les fonctions JSON dans SQLite pour l’agrégation

Pour cette série de fonctions JSON dans SQLite, nous devons étendre les données JSON d’exemple par rapport aux exemples précédents, pour démontrer l’utilisation de chaque fonction d’une manière compréhensible. Supposons que ceci est votre table movie dans la base de données avec un champ nommé data, comme mentionné au début de cette section:

data
{« ID »: 1, « Name »: « Forgotten in the Planet », « Year »: 1970, « Genre »: [« Comedy », « Crime »], « Director »: « Henrie Randell Githens », « Cast »: [« Adrian Gratianna », « Tani O’Hara », « Tessie Delisle »], « Runtime »: 90, « Rate »: 7.0}
{« ID »: 2, « Name »: « The Obsessed’s Fairy », « Year »: 1972, « Genre »: [« Adventure »], « Director »: « Susanne Uriel Lorimer », « Cast »: [« Dacy Dex Elsa », « Matilde Kenton Collins »], « Runtime »: 98, « Rate »: 9.5}
{« ID »: 3, « Name »: « Last in the Kiss », « Year »: 1965, « Genre »: [« History », « Animation »], « Director »: « Simone Mikey Bryn », « Cast »: [« Margery Maximilianus Shirk », »Harri Garwood Michelle »], « Runtime »: 106, « Rate »: 4.1}

La fonction d’agrégat json_group_array() avec exemple de requête SQL

La fonction json_group_array() est similaire à toute autre fonction d’agrégat dans SQLite, elle regroupe plusieurs lignes de données en une seule matrice JSON.

Par exemple, cette requête retournerait une matrice JSON avec tous les noms des films ayant un taux supérieur à 6:

 

SELECT
    json_group_array ( json_extract ( data, '$.Name' ) ) AS movie_names
FROM
    movie
WHERE
    json_extract ( data, '$.Rate' ) > 6

Et le résultat serait quelque chose comme ceci :

movie_names
[« Forgotten in the Planet », « The Obsessed’s Fairy »]

La fonction JSON json_group_object() avec exemple de requête SQL

La fonction json_group_object() crée un objet JSON en regroupant deux colonnes d’une requête, où la première colonne est utilisée comme clé et la seconde comme valeur. La première sera utilisée comme nom de clé des champs JSON, et la seconde comme leurs valeurs.

Par exemple, cette requête retournera un objet JSON où le nom de chaque champ est l’ID d’un film et la valeur du champ est le nom correspondant si le movie a un Taux supérieur à 6, ce qui exclura le dernier film:

 

SELECT
    json_group_object ( json_extract ( Data, '$.ID' ), json_extract ( Data, '$.Name' ) ) AS movie_rates
FROM
    movie
WHERE
    json_extract ( Data, '$.Rate' ) > 5

Le résultat serait quelque chose comme ceci, un objet JSON composé de l’ID et du nom des deux premiers films car ils ont un Rate supérieur à 5:

movie_rates
{« 1 »: « Forgotten in the Planet », »2″: »The Obsessed’s Fairy »}

Analyser les données JSON avec json_each() et json_tree() les fonctions de table à valeur dans SQLite

SQLite propose deux puissantes fonctions à valeur de table pour travailler avec vos données JSON, json_each() et json_tree(). Elles ont des variations avec et sans le paramètre de chemin, vous permettant d’interagir avec vos JSON à différentes profondeurs.

Supposons que ceci soit la seule valeur JSON insérée dans le champ données de la table des films dans la base de données SQLite, commençons par expliquer les fonctions agrégées appliquées à ce sujet :

data
{ « ID »: 1, « Name »: « Forgotten in the Planet », « Year »: 1970, « Genre »: [« Comedy », « Crime »], « Director »: « Henrie Randell Githens », « Cast »: [« Adrian Gratianna », « Tani O’Hara », « Tessie Delisle »], « Runtime »: 90, « Rate »: 7.0 }

La Fonction json_each() en SQLite Avec Exemple de Requête SQL

La fonction json_each() décompose un objet JSON en lignes, avec chaque ligne représentant un champ dans l’objet JSON, en ne parcourant que le premier niveau de champs JSON imbriqués.

Par exemple, cette requête retournerait 8 lignes pour chaque champ dans les données JSON :

 

SELECT
    key,
    value,
    type
FROM
    movie,
    json_each ( data )

Le résultat serait quelque chose comme ceci, en listant la clé et les valeurs de chaque champ dans le JSON sous forme de ligne, Comme vous le voyez, le champ de tableau Genre et Cast sont listés tels quels, et la fonction n’est pas allée les examiner pour énumérer les éléments du deuxième niveau :

key Value Type
ID 1 integer
Name Forgotten in the Planet text
Year 1970 integer
Genre [« Comedy », »Crime »] array
Director Henrie Randell Githens text
Cast [« Adrian Gratianna », »Tani O’Hara », »Tessie Delisle »] array
Runtime 90 integer
Rate 7.0 real

La Fonction json_tree() en SQLite Avec Exemple de Requête SQL

La fonction json_tree() est utilisée pour parcourir et analyser complètement les données JSON, ce qui signifie qu’elle irait dans chaque champ à travers tous les niveaux imbriqués. La fonction json_tree() parcourt le JSON, examinant chaque partie de celui-ci, puis vous donne une table qui détaille chaque élément qu’elle a trouvé.

La json_tree() affiche les résultats sous forme d’un ensemble de lignes, offrant une vue claire même des données JSON les plus complexes et imbriquées. Cette table indique le nom de chaque élément, le type de données qu’il représente, sa valeur et sa localisation au sein de la structure JSON.

Ainsi, cette requête retournerait plusieurs lignes, décrivant la structure de l’objet JSON, y compris le champ imbriqué Cast :

 

SELECT
    key,
    value,
    type
FROM
    movie,
    json_tree ( data )

Le résultat de la requête ci-dessus serait quelque chose comme ceci :

key Value Type
{« ID »:1, »Name »: »Forgotten in the Planet », »Year »:1970, »Genre »:[« Comedy », »Crime »], »Director »: »Henrie Randell Githens », »Cast »:[« Adrian Gratianna », »Tani O’Hara », »Tessie Delisle »], »Runtime »:90, »Rate »:7.0} object
ID 1 integer
Name Forgotten in the Planet text
Year 1970 integer
Genre [« Comedy », »Crime »] array
0 Comedy text
1 Crime text
Director Henrie Randell Githens text
Cast [« Adrian Gratianna », »Tani O’Hara », »Tessie Delisle »] array
0 Adrian Gratianna text
1 Tani O’Hara text
2 Tessie Delisle text
Runtime 90 integer
Rate 7 real

Avec le paramètre de chemin, json_tree() peut se concentrer sur une partie spécifique du JSON. Si vous donnez à json_tree() un chemin spécifique dans le JSON comme second argument, il commencera son exploration à partir de là.

Par exemple, cette requête ignore tout ce qui se trouve en dehors du champ Cast, offrant une vue focalisée de cet ensemble JSON imbriqué :

 

SELECT
    key,
    value,
    type
FROM
    movie,
    json_tree ( data, '$.Cast' )

Le résultat de la requête ci-dessus serait quelque chose comme ceci :

key Value Type
0 Adrian Gratianna text
1 Tani O’Hara text
2 Tessie Delisle text

Curiosité : Avez-vous déjà remarqué le ‘1’ dans l’URL de la documentation officielle de JSON en SQLite et vous êtes demandé si cela avait une histoire ? Lorsque le support JSON a été publié pour la première fois en SQLite en 2015, le créateur s’attendait à ce que ‘JSON1’ ne soit que le début d’une série de versions—JSON2, JSON3, et ainsi de suite. Mais voici l’aspect amusant : ‘JSON1’ a été si efficace et efficace qu’ils n’ont jamais eu besoin de créer un ‘JSON2’ ou un ‘JSON3’. Ainsi, le ‘1’ dans ‘JSON1’ n’est pas seulement un indicateur de version—c’est un signe de succès !

3. Approches Pratiques Pour Interroger N’importe Quelle Donnée JSON Complexe en SQLite

Utiliser les fonctions JSON d’SQLite en collaboration avec les fonctions intégrées d’SQLite vous permet de réaliser des requêtes de données plus complexes. Voici quelques-uns de ces exemples incluant agrégation, filtrage et expressions de chemin.

Comme mentionné au début du post, les données JSON dans la table movie dans les exemples pour toutes les sections restantes seraient similaires à ceci:

data
{« ID »: 1, « Name »: « Forgotten in the Planet », « Year »: 1970, « Genre »: [« Comedy », « Crime »], « Director »: « Henrie Randell Githens », « Cast »: [« Adrian Gratianna », « Tani O’Hara », « Tessie Delisle »], « Runtime »: 90, « Rate »: 7.0}
{« ID »: 2, « Name »: « The Obsessed’s Fairy », « Year »: 1972, « Genre »: [« Comedy », « Adventure »], « Director »: « Susanne Uriel Lorimer », « Cast »: [« Dacy Dex Elsa », « Matilde Kenton Collins »], « Runtime »: 98, « Rate »: 9.5}
{« ID »: 3, « Name »: « Last in the Kiss », « Year »: 1965, « Genre »: [« History », « Animation »], « Director »: « Simone Mikey Bryn », « Cast »: [« Margery Maximilianus Shirk », »Harri Garwood Michelle »], « Runtime »: 106, « Rate »: 4.1}

Confectionner des requêtes SQL agrégées avec les fonctions JSON en SQLite

Cette approche implique l’utilisation des fonctions JSON en combinaison avec les fonctions agrégées intégrées d’SQLite pour effectuer des calculs sur les données JSON. Par exemple, vous pouvez calculer la durée moyenne des films classés comme Comédie en utilisant la requête suivante:

 

SELECT
    AVG( json_extract ( data, '$.Runtime' ) ) AS average_runtime
FROM
    movie AS M,
    json_each ( json_extract ( M.data, '$.Genre' ) ) AS T
WHERE
    T.value = 'Comedy';

Le résultat de la requête ci-dessus serait quelque chose comme ceci, car il y a deux films dans la base de données avec le genre Comédie, et leur durée est de 90 et 98, donc la moyenne serait comme ceci:

average_runtime
94

Décodage JSON et filtrage de données avec plusieurs conditions

Vous pouvez utiliser la fonction json_extract() en SQLite pour un filtrage approfondi en l’utilisant dans la clause WHERE d’une requête SQL. Par exemple, vous pouvez filtrer les films en fonction de conditions spécifiques, tels que les films qui ont deux membres de la distribution ou plus et un Rate supérieur à une certaine valeur.

 

SELECT
    json_extract ( data, '$.Name' ) AS movie_name,
    json_extract ( data, '$.Rate' ) AS movie_rate,
    json_array_length ( json_extract ( data, '$.Cast' ) ) AS cast_size
FROM
    movie
WHERE
    json_array_length ( json_extract ( data, '$.Cast' ) ) >= 2
    AND json_extract ( data, '$.Rate' ) > 8;

Le résultat de la requête ci-dessus serait quelque chose comme ceci:

movie_name movie_rate cast_size
The Obsessed’s Fairy 9.5 2

Utilisation d’expressions de chemin pour extraire des valeurs spécifiques des données JSON en SQLite

Les expressions de chemin peuvent être utilisées pour accéder aux données JSON imbriquées à cet adresse spécifique. Cet exemple renvoie une liste de tous les movie directors qui ont dirigé un film dans un certain genre, comme l’Histoire.

 

SELECT DISTINCT
    json_extract ( data, '$.Director' ) AS movie_director
FROM
    movie,
    json_each ( json_extract ( data, '$.Genre' ) )
WHERE
    value = 'History';

Le résultat de la requête ci-dessus serait quelque chose comme ceci:

movie_director
Simone Mikey Bryn

4. Comment vérifier le schéma de vos données JSON en SQLite

La vérification du schéma des données JSON en SQLite est une manière d’assurer la structure et la cohérence de vos données, d’améliorer la gestion des erreurs futures et de simplifier la manipulation de données complexes. Bien que SQLite ne dispose pas de fonctions intégrées pour la validation du schéma, vous pouvez utiliser ses fonctions JSON et la fonction CHECK à cet effet.

Vérification de la structure JSON avec les fonctions SQLite json_type() et check()

La fonction json_type() peut être utilisée pour vérifier le type d’un champ dans les données JSON. Par exemple, en construisant sur la création précédente de la table des films, supposons que lors de la création de la table pour stocker les données JSON d’un film, vous souhaitiez vous assurer que chaque entrée ait les champs Nom et Année, avec Année étant un entier. Pour cela, vous pouvez utiliser une contrainte CHECK() avec la fonction json_type() lors de la création de la table :

 
CREATE TABLE movie ( data TEXT CHECK ( json_type ( data, '$.Name' ) IS NOT NULL AND json_type ( data, '$.Year' ) = 'integer' ) );

Ici, json_type() vérifie le type des champs spécifiés dans vos données JSON, à savoir le Nom et l’Année. Si une nouvelle insertion ou une opération de mise à jour tente d’ajouter des données où le Nom n’existe pas ou où l’Année n’est pas un entier, la contrainte CHECK() échouera et l’opération sera rejetée. Cela aide à maintenir l’intégrité des données JSON dans la table des films.

Valider les données JSON à l’aide de la json_valid() Fonction dans SQLite

La fonction json_valid() vérifie la validité des données JSON du point de vue du format standard JSON, offrant un degré de validation de schéma. Par exemple, pour garantir l’intégrité des données JSON avant insertion, vous pouvez appliquer des contrôles de validation comme ceci:

 

INSERT INTO movie ( data ) SELECT
'{"Name":"Naked of Truth","Year":1979}' AS movie_input
WHERE
    json_valid ( movie_input );

Dans cette déclaration, json_valid() vérifie si la chaîne JSON fournie est valide. Si c’est le cas, les données sont insérées dans la table des films et si ce n’est pas le cas, l’opération est ignorée. Cette mesure de sécurité empêche l’insertion de données JSON mal formées.

Prenons un autre exemple combinant les deux règles, la contrainte lors de la phase de création de la table des films et le contrôle json_valid() lors des insertions. Considérons la requête suivante :

 

INSERT INTO movie ( data ) SELECT
'{"Year":"1979"}' AS movie_input
WHERE
    json_valid ( movie_input );

Le résultat de cette requête serait un message d’erreur « Contrainte CHECK échouée » car la valeur d’entrée n’a pas de champ Nom et le champ Année n’est pas un entier, donc l’insertion échouerait, même si les données JSON fournies sont un JSON valide.

De plus, pour une validation de schéma plus approfondie sur des données JSON complexes et imbriquées, vous pouvez également envisager la bibliothèque JSONschema de Python.

5. Gérer les données JSON imbriquées dans SQLite

La navigation dans des données JSON imbriquées et hiérarchiques dans SQLite peut présenter certaines difficultés. Cependant, les fonctions JSON intégrées de SQLite facilitent ce processus et le rendent gérable. Voici quelques stratégies pour gérer les données JSON imbriquées dans SQLite.

Dépliement des données JSON hiérarchiques à l’aide de requêtes SQL

Les fonctions json_each() et json_extract() de SQLite peuvent vous aider à naviguer à travers les couches de données JSON imbriquées. Considérez cette requête qui utilise json_each() pour analyser les données et json_extract() pour extraire de manière sélective les informations requises.

Par exemple, cette requête va creuser dans le tableau Cast de chaque enregistrement JSON dans le champ data de la table movie, et va énumérer les movies qui ont plus de 2 membres Cast:

 

SELECT
    key,
    json_extract ( data, '$.Name' ) AS movie_name,
    json_extract ( data, '$.Year' ) AS movie_year,
    json_array_length ( json_extract ( data, '$.Cast' ) ) AS cast_size
FROM
    movie,
    json_each ( data )
WHERE
    type = 'array'
    AND cast_size > 2
GROUP BY
    movie_name;

Le résultat de la requête ci-dessus serait quelque chose comme ceci:

key movie_name movie_year cast_size
Simone Mikey Bryn Forgotten in the Planet 1970 3

Naviguer à travers les tableaux JSON en utilisant des requêtes SQL

Les objets JSON peuvent contenir des informations importantes sous forme de tableau. En utilisant json_tree() et json_extract() en combinaison, vous pouvez parcourir ces tableaux imbriqués et extraire des données à partir d’eux.

Par exemple, cette requête récupère le nom de chaque Acteur à partir du tableau Cast de chaque enregistrement de film:

 

SELECT
    json_extract ( data, je.fullkey ) AS actor,
    json_extract ( data, '$.Name' ) AS movie_name,
    json_array_length ( data, '$.Cast' ) AS cast_size
FROM
    movie,
    json_tree ( data ) AS je
WHERE
    ( je.type = 'text' )
    AND ( je.fullkey LIKE '%Cast%' );

Le résultat de cette requête serait ceci:

actor movie_name cast_size
Adrian Gratianna Forgotten in the Planet 3
Tani O’Hara Forgotten in the Planet 3
Tessie Delisle Forgotten in the Planet 3
Dacy Dex Elsa The Obsessed’s Fairy 2
Matilde Kenton Collins The Obsessed’s Fairy 2
Margery Maximilianus Shirk Last in the Kiss 2
Harri Garwood Michelle Last in the Kiss 2
Adrian Gratianna Forgotten in the Planet 3
Tani O’Hara Forgotten in the Planet 3
Tessie Delisle Forgotten in the Planet 3

Aplatir les données JSON en utilisant la fonction json_each() dans SQLite

Parfois, simplifier les structures JSON imbriquées en les aplatissant peut être une approche pratique pour résoudre certaines requêtes complexes contre les objets JSON. La fonction json_tree() de SQLite peut être utilisée pour aplatir les objets JSON.

Par exemple, cette requête utilise json_tree() pour convertir les données JSON en une table de paires clé-valeur, complètement aplatie, la requête récupérerait chaque type de valeur principale, en passant également par les tableaux et les objets, du premier enregistrement de film:

 

SELECT
    jt.fullkey,
    jt.key,
    jt.value
FROM
    movie,
    json_tree ( data ) AS jt
WHERE
    ( jt.key<> '' )
    AND ( jt.type IN ( 'integer', 'text', 'real' ) )
    AND json_extract ( data, '$.ID' ) = 1

Le résultat de cette requête serait ceci:

fullkey key value
$.ID ID 1
$.Name Name Forgotten in the Planet
$.Year Year 1970
$.Genre[0] 0 Comedy
$.Genre[1] 1 Crime
$.Director Director Henrie Randell Githens
$.Cast[0] 0 Adrian Gratianna
$.Cast[1] 1 Tani O’Hara
$.Cast[2] 2 Tessie Delisle
$.Runtime Runtime 90
$.Rate Rate 7

En adoptant ces méthodes, vous pouvez analyser, gérer et décoder efficacement les données JSON dans SQLite, ce qui est précieux lors de la manipulation de données JSON complexes.

6. Comment utiliser l’indexation pour optimiser les requêtes sur les données JSON dans SQLite

Indexer les données JSON dans SQLite est une manière efficace d’optimiser les opérations de recherche et d’améliorer les performances des requêtes, surtout pour de larges ensembles de données. En créant un index basé sur certaines propriétés JSON, vous pouvez accélérer considérablement les opérations de recherche sur une colonne JSON.

Le principe derrière cette approche est simple. Plutôt que de procéder à une analyse complète de la table et de parser le JSON pour chaque ligne, ce qui peut être coûteux en ressources, SQLite peut exploiter l’index pour localiser rapidement les lignes d’intérêt.

Comment Ajouter un Index SQL sur les Données JSON dans SQLite

Prenons un exemple pratique avec le movie dataset. Par exemple, si vous recherchez fréquemment des films par leur Name, créer un index sur cette propriété serait bénéfique:

 
CREATE INDEX idx_name ON movie ( json_extract ( data, '$.item.Name' ) );

Ici, le data est la colonne contenant les données JSON, et le movie est la table. La fonction json_extract() extrait le Name de chaque movie des données JSON, et SQLite utilise cette valeur pour créer un index.

Une fois que vous exécutez cette requête et que l’index est établi, SQLite peut rapidement récupérer des données lorsque vous interrogez un film par son Name. Cette requête serait beaucoup plus rapide avec l’index idx_name en place. Par conséquent, l’ajout d’index aux données JSON dans SQLite offre des capacités d’optimisation puissantes, ce qui en fait un moyen efficace de gérer de gros ensembles de données JSON.

Comment créer un index sur plusieurs champs de données JSON dans SQLite

Considérons un autre exemple où vous pourriez interroger fréquemment des données spécifiques en fonction de plus d’un champ. Par exemple, si vous recherchez souvent films par Nom et Année, il serait avantageux de créer un index sur ces propriétés ensemble. Dans SQLite, cela pourrait être fait en créant un index sur une expression calculée:

 
CREATE INDEX idx_name_year ON movie ( json_extract ( data, '$.Item.Name' ), json_extract ( data, '$.Item.Year' ) );

Une fois de plus, lorsque cet index est établi, SQLite peut rapidement récupérer des données lorsque vous interrogez un film par Nom et Année.

7. Prise en charge de Json5 dans SQLite

Le JSON5 a été introduit pour supporter certaines syntaxes compatibles ECMA et rendre le JSON un peu plus adapté pour être utilisé comme langage de configuration. SQLite a introduit le support de l’extension JSON5 dans la version 3.42.0. Bien que SQLite puisse lire et interpréter un texte JSON qui inclut des extensions JSON5, tout texte JSON généré par les fonctions de SQLite sera strictement conforme à la définition de JSON canonique. Voici quelques-unes des principales fonctionnalités que l’extension JSON5 ajoute au support JSON dans SQLite.

Objets JSON Avec Commentaires dans SQLite JSON

JSON5 permet des commentaires simples (//…) et multilignes (/…/). Cela peut être particulièrement utile pour ajouter du contexte ou des explications directement dans vos données JSON. Voici un exemple de commentaires dans des objets JSON :

 

/* A
multi-line
comment
in JSON5 */

{ 
  "key": "value" // A single-line comment in JSON5
}

Clés d’Objets Sans Guillemets dans SQLite JSON

Dans JSON5, les clés d’objet peuvent être des identifiants non entourés de guillemets, ce qui simplifie la syntaxe JSON. Cependant, il est important de noter que cela peut limiter la compatibilité avec des systèmes strictement conformes aux normes JSON.

 
{  key: "value" }

Chaînes Multilignes dans Objets JSON

JSON5 prend en charge les chaînes multilignes, qui peuvent être réalisées en échappant les caractères de nouvelle ligne. Cela est utile lors de la manipulation de grandes chaînes ou lors de la mise en forme de la chaîne dans un format plus lisible.

 
{  key: "This is a \\\\\\\\  multiline string" }

Validation Json5 vs. JSON Canonique dans SQLite

Ici, nous allons passer en revue les techniques de validation complètes pour les objets JSON5 et JSON canoniques, en expliquant leur support par des exemples de requêtes SQL précises dans la base de données SQLite.

Pour déterminer si une chaîne est un JSON5 valide, vous pouvez utiliser la fonction json_error_position(). Cette fonction renverra une valeur non nulle si la chaîne n’est pas bien formée en JSON ou JSON5. Voici un exemple:

 

SELECT
    json_error_position ( '{ key: "value"}' ) AS error_position;

Le résultat de cette requête serait 0, indiquant qu’aucune erreur n’est détectée ici, même si la clé est non citée puisque c’est une extension valide de JSON5.

error_position
0

D’autre part, pour convertir une chaîne JSON5 en JSON canonique, vous pouvez utiliser la fonction json(). Bien que cette fonction reconnaisse et traite les entrées JSON5, elle ne produira que du JSON canonique. Cela permet une compatibilité ascendante avec les systèmes attendant du JSON canonique. Voici un exemple:

 

SELECT
    JSON ( '{key: "value"}' ) AS canonical_json;

Le résultat de cette requête serait un JSON canonique, converti à partir du format JSON5, qui a fait en sorte que la clé soit citée ici:

canonical_json
{« key »: « value »}

Cependant, soyez conscient que la fonction json_valid() continuera à signaler faux pour les entrées qui ne sont pas du JSON canonique, même si l’entrée est un JSON5 valide. C’est une distinction importante lorsque vous travaillez avec à la fois le JSON canonique et JSON5 dans SQLite. Par exemple, considérez la requête suivante:

 

SELECT
    json_valid ( '{key: "value"}' ) AS valid_json;

Le résultat de cette requête serait 0, indiquant que ce n’est pas un JSON valide puisqu’il a une clé non citée, ce qui est une violation du format JSON canonique:

valid_json
{« key »: « value »}

8. Erreurs courantes et dépannage lors de l’utilisation de JSON dans SQLite

Gérer les données JSON dans SQLite implique certaines erreurs courantes qui peuvent être évitées avec une compréhension plus approfondie des mécanismes spécifiques, telles que l’utilisation correcte des fonctions. Voici quelques considérations clés.

Comment Déboguer les Erreurs de Syntaxe dans les Données JSON au Stade de Parsing JSON de SQLite

Les données JSON doivent être correctement formatées et suivre une syntaxe standard spécifique pour être analysées et traitées dans la base de données SQLite. Si votre chaîne JSON est mal formatée, SQLite ne pourra pas l’interpréter, ce qui entraînera des erreurs. Par exemple, vous pourriez avoir des parenthèses non appariées, une utilisation incorrecte des guillemets ou des virgules mal placées.

SQLite fournit la fonction json_valid() pour valider la chaîne JSON, comme son nom l’indique. La fonction json_valid() renvoie un si l’entrée est une chaîne JSON bien formée et 0 sinon. Voici un exemple:

 
SELECT json_valid('{"Name":"Naked of Truth","Year":1979}');

Dans le cas d’une erreur de syntaxe dans la chaîne JSON, la fonction json_error_position() peut être utilisée pour identifier la position dans la chaîne où l’erreur s’est produite:

 
SELECT json_error_position('{"Name":"Naked of Truth","Year":1979}');

Utilisation Incorrecte des Fonctions JSON Lors de la Requête Contre les Données JSON

L’utilisation incorrecte des fonctions JSON est un autre problème courant, il est donc crucial d’assurer une solide compréhension des fonctions JSON et de leur utilisation dans SQLite pour une gestion réussie des données. Par exemple, utiliser le mauvais chemin ou ne pas tenir compte du système d’index à base zéro des tableaux JSON dans SQLite peut entraîner des erreurs ou des récupérations de données incorrectes.

Pas de support BLOB dans les fonctions JSON de SQLite

Il est important de s’assurer de ne pas essayer d’utiliser des BLOBs avec les fonctions JSON dans SQLite parce que toutes les fonctions JSON dans SQLite actuellement retournent une erreur si l’un de leurs arguments est un BLOB et non une entrée JSON valide. SQLite ne prend pas actuellement en charge aucun encodage binaire de JSON, bien que cela puisse être une amélioration potentielle à l’avenir.

Comment Valider un JSON Lors de la Requête SQL des Données JSON dans SQLite

La fonction json() dans SQLite est principalement utilisée pour imposer la mise en forme JSON d’une chaîne en ajoutant des guillemets, en échappant les caractères nécessaires, etc. L’utilisation incorrecte de la fonction json() pourrait entraîner un manque de détection des erreurs et des incohérences potentielles des données.

Cependant, elle n’est pas conçue pour valider un JSON. Pour valider une chaîne JSON ou trouver une erreur de syntaxe, utilisez les fonctions json_valid() et json_error_position() comme discuté précédemment.

Conclusion

Dans ce guide complet, nous avons parcouru l’intégration puissante de JSON et SQLite, offrant un aperçu des vastes opportunités que cette combinaison fournit. Nous avons commencé par une vue d’ensemble des fonctions JSON de SQLite avec leurs cas d’utilisation détaillés et des exemples de requêtes SQL.

Nous avons exploré des techniques de requête avancées, telles que la manipulation de données JSON hiérarchiques dans SQLite. Ce voyage a approfondi les mécanismes de décodage et de gestion des données JSON, soulignant l’utilité des fonctions SQLite comme json_each() et json_tree(). Nous avons également abordé l’importance de l’aplatissement des données JSON pour une gestion des données efficace.

Ensuite, nous sommes entrés dans un domaine souvent négligé : l’amélioration des performances via l’indexation. Cette puissante optimisation peut grandement accélérer les performances des requêtes et améliorer votre expérience SQLite avec JSON. L’extension JSON5 moderne a ensuite été discutée, apportant plus de flexibilité à votre formatage de données JSON.

Enfin, nous avons abordé certaines erreurs courantes et des astuces de dépannage pour adoucir votre parcours avec JSON dans SQLite, renforçant l’importance d’une syntaxe JSON correcte et de l’utilisation appropriée des fonctions JSON SQLite.

Rappelez-vous, apprendre et expérimenter sont les clés pour débloquer tout le potentiel de JSON dans SQLite. Alors que vous appliquez ces techniques à vos projets, partagez vos expériences pour aider les autres dans un voyage similaire. Alors, continuons à apprendre et à repousser les frontières avec JSON dans SQLite. Bonne utilisation du JSON !

Source:
https://dzone.com/articles/how-to-master-advanced-json-querying-in-sqlite