Wie man fortgeschrittene JSON-Abfragen in SQLite beherrscht

Im vorherigen Artikel, Grundlagen lernen: So verwenden Sie JSON in SQLite, haben wir uns in die wichtigsten JSON-Funktionen von SQLite und ihre Fähigkeiten eingelassen. Wir haben die Verwendung von JSON als unstrukturiertes Daten in einer SQLite-Datenbank erkundet. Vor allem haben wir einige der notwendigen SQLite-JSON-Funktionen beschrieben, ihre Rolle bei der Datenspeicherung und -wiederauffindung diskutiert und praktische SQL-Abfragebeispiele gefolgt. Diese grundlegende Kenntnis der Arbeit mit JSON-Daten in SQLite bildet die Grundlage für Ihre fortgeschrittene Erkundung des Themas.

Fangen wir an!

Integration von SQL- und NoSQL-Fähigkeiten durch das gründliche Verständnis der JSON-Behandlung in SQLite

Die Weiterentwicklung Ihrer Kenntnisse über die JSON-Behandlungsfähigkeiten von SQLite kombiniert das Beste aus SQL und NoSQL und bietet eine effiziente, alles in einer Lösung zur Verwaltung gemischter Datenformate. Die Unterstützung von JSON-Daten in SQLite macht SQLite zu einer Powerbank für unstrukturierte Daten, ähnlich wie bei Datenbanken wie MongoDB.

Die fortschrittliche JSON-Integration von SQLite vereint die Flexibilität von JSON mit der Robustheit von SQLite, was ideal für die heutigen datenintensiven Anwendungen ist. Die JSON-Fähigkeiten von SQLite gehen über das bloße Speichern und Abrufen von Daten hinaus. Sie ermöglichen SQL-ähnliche Operationen auf JSON-Daten und schaffen eine Brücke zwischen der Verwaltung strukturierter und unstrukturierter Daten.

Dieses Handbuch konzentriert sich darauf, Ihre praktischen Fähigkeiten mit den JSON-Funktionen von SQLite durch praktische SQL-Abfragebeispiele zu erweitern. Jeder Abschnitt soll Ihr Verständnis verbessern und Ihnen einen Vorsprung bei der Bearbeitung von realen JSON-Daten in SQLite verschaffen.

Am Ende werden Sie gut ausgestattet sein mit dem verfügbaren Werkzeugset zur Handhabung von JSON-Daten in SQLite, um sich mit beliebigen JSON-Datenstrukturen auseinanderzusetzen. Sie werden lernen, wie man Indizes anwendet, mit Pfadausdrücken abfragt, filtriert und sogar Daten validiert – wesentliche Aufgaben zur Handhabung dynamischer Daten in strukturierten Umgebungen unter Verwendung von JSON-Funktionen in SQLite.

1. Wie man JSON in SQLite integriert

Die integrierten JSON-Funktionen von SQLite spielen eine entscheidende Rolle bei der Integration von JSON und SQLite. Ab der SQLite-Version 3.38.0, veröffentlicht am 2022-02-22, sind JSON-Funktionen standardmäßig enthalten, während sie vorher eine Erweiterung waren. Das bedeutet, dass diese JSON-Funktionen in SQLite vor dieser Version optional waren, während sie jetzt standardmäßig verfügbar sind und bei Bedarf durch Einstellung einer Compile-Zeit-Option deaktiviert werden können.

Sie können JSON-Daten in SQLite mithilfe einfacher INSERT-SQL-Abfragen importieren. Alternativ können Sie auch Drittanbietertools oder Scripting-Techniken nutzen, um große JSON-Datensätze zu importieren. Um JSON-Daten zu extrahieren, können Sie die json_extract()-Funktion verwenden, die Werte, die einem bestimmten Schlüssel zugeordnet sind, aus einer JSON-Datenspalte abruft.

2. Nutzung von SQLite JSON-Funktionen für fortgeschrittene JSON-Decodierung und SQL-Abfragen

In diesem Abschnitt werden wir fortgeschrittene JSON-Funktionen und ihre Fähigkeiten in SQLite erkunden, indem wir SQL-Abfragebeispiele für jeden einzelnen verwenden. In diesem Blogbeitrag werden wir Beispieldaten für generierte JSON-Daten verwenden, die movie genannt werden, als Referenz, die als untersuchte Daten verwendet wird:

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

Sie können die Daten in eine Tabelle namens movie mit einem Feld namens data einfügen und beginnen, diese Beispielabfragen jetzt gegen sie auszuführen. In den folgenden Abfragen werden wir die Eingabetexte der JSON-Funktionen verwenden, um die Erklärung der Funktionen einfach zu halten, und dann werden wir zu den in der Datenbank eingefügten Daten zurückkehren, beginnend mit Abschnitt 3.

Zur Vereinfachung in diesem Beispiel verwenden wir eine einfachere Version der ersten JSON-Daten:

 

{
    "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."
}

Fehlererkennung mit der json_error_position()-Funktion in SQLite

Die json_error_position()-Funktion kann verwendet werden, um Fehler in der Syntax Ihrer JSON-Daten zu erkennen. Wenn der Eingabetext ein gültiges JSON ist, wird 0 zurückgegeben, andernfalls wird die Zeichenposition des ersten Fehlers zurückgegeben.

Zum Beispiel, wenn Sie einen fehlerhaften JSON-String als Eingabe für diese Funktion haben, wie diesen:

 

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

Das Ergebnis des Ausführens dieser Abfrage wäre die Fehlerposition der Syntax, die aufgetreten ist, was in diesem Fall die Position des fehlenden „}“ am Ende ist:

error_position
38

Die json_patch() Funktion in SQLite für das Zusammenführen von JSON-Objekten

Die json_patch() Funktion fügt 2 JSON-Objekte zusammen, ermöglicht das Hinzufügen, Ändern und Löschen von JSON-Objekten.

Zum Beispiel würde diese Abfrage die beiden JSON-Eingaben zu einem JSON kombinieren:

 

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

Das Ergebnis wäre etwa so, ein JSON-Objekt, das aus beiden Feldern zusammengesetzt ist:

patched_json
{„Name“:“Naked of Truth“,“Year“:2011}

Manipulieren von JSON-Feldern mit der json_set() Funktion in SQLite

Die json_set() Funktion dient zum Hinzufügen oder Ersetzen von JSON-Eigenschaften. json_set() nimmt als erstes Argument einen JSON-String und danach null oder mehr Paare aus Pfad/Wert-Argumenten. Das Ergebnis wäre ein JSON-String, der durch Hinzufügen oder Ersetzen von Werten basierend auf den bereitgestellten Pfad- und Wertpaaren erstellt wird.

Zum Beispiel, aufbauend auf den JSON-Daten der vorherigen Abfrage, wenn Sie ein Director-Feld an die JSON-Daten anhängen möchten, können Sie eine Abfrage wie diese schreiben:

 

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

Und das Ergebnis wäre etwa so:

json_data
{„Name“:“Naked of Truth“,“Year“:2011,“Director“:“Ellynn OBrien“}

Die json_quote() Funktion in SQLite

Die Funktion json_quote() ist einfach, sie setzt den Eingabewert einfach in doppelte Anführungszeichen, um ihn zu einem gültigen JSON-String zu machen. Hier ist ein einfaches Abfragebeispiel dafür:

 

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

Und das Ergebnis wäre ungefähr so:

valid_json_string
„Naked of Truth“

Gebrauchsanweisung für json_group_object() und json_group_array() JSON-Funktionen in SQLite für Aggregation

Für diese Gruppe von JSON-Funktionen in SQLite müssen wir die Beispiel-JSON-Daten im Vergleich zu den vorherigen Beispielen erweitern, um den Verwendungszweck jeder Funktion verständlich darzustellen. Angenommen, dies ist Ihre movie-Tabelle in der Datenbank mit einem Feld namens data, wie zu Beginn dieses Abschnitts erwähnt:

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}

Die Aggregatfunktion json_group_array() mit SQL-Abfragebeispiel

Die Funktion json_group_array() ist ähnlich wie jede andere Aggregatfunktion in SQLite und gruppiert mehrere Datensätze in einer einzigen JSON-Array.

Zum Beispiel würde diese Abfrage ein JSON-Array mit allen Namen der Filme zurückgeben, deren Bewertung größer als 6 ist:

 

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

Und das Ergebnis wäre ungefähr so:

movie_names
[„Forgotten in the Planet“, „The Obsessed’s Fairy“]

Die json_group_object() JSON-Funktion mit SQL-Abfragebeispiel

Die json_group_object() Funktion erstellt ein JSON-Objekt, indem sie zwei Spalten einer Abfrage gruppiert, wobei die erste Spalte als Schlüssel und die zweite als Wert verwendet wird. Die erste wird als Schlüsselname der JSON-Felder verwendet, und die zweite als deren Werte.

Zum Beispiel gibt diese Abfrage ein JSON-Objekt zurück, bei dem der Name jedes Felds eine Film-ID ist und der Wert der entsprechende Name, wenn das movie einen Rate größer als 6 hat, was den letzten Film ausschließt:

 

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

Das Ergebnis wäre etwa so, ein JSON-Objekt, das aus der ID und dem Namen der ersten und zweiten Filme besteht, da sie einen Rate größer als 5 haben:

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

JSON-Daten mit json_each() und json_tree() Tabellenwertfunktionen in SQLite analysieren

SQLite bietet zwei leistungsstarke tabellenwert Funktionen zur Arbeit mit Ihren JSON-Daten, json_each() und json_tree(). Sie haben Variationen mit und ohne den Pfadparameter, die es Ihnen ermöglichen, mit Ihren JSON auf verschiedenen Tiefen zu interagieren.

Angenommen, dies ist der einzige JSON-Wert, der in dem Datenfeld der Filmtabelle in der SQLite-Datenbank eingefügt wurde, lassen Sie uns mit der Erklärung der Aggregatfunktionen beginnen:

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 }

Die json_each() Funktion in SQLite mit SQL-Abfragebeispiel

Die json_each() Funktion zerlegt ein JSON-Objekt in Zeilen, wobei jede Zeile ein Feld im JSON-Objekt darstellt und nur durch die erste Ebene der verschachtelten JSON-Felder geht.

Zum Beispiel würde diese Abfrage 8 Zeilen für jedes Feld im JSON-Daten zurückgeben:

 

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

Das Ergebnis wäre etwa folgendes, wobei der Schlüssel und die Werte jedes Feldes im JSON als Zeile aufgelistet werden. Wie Sie sehen, werden die Array-Felder Genre und Cast so aufgelistet, wie sie sind, und die Funktion ist nicht tiefer gegangen, um die Elemente der zweiten Ebene aufzulisten:

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

Die json_tree() Funktion in SQLite mit SQL-Abfragebeispiel

Die json_tree() Funktion wird verwendet, um JSON-Daten vollständig zu durchlaufen und zu parsen, was bedeutet, dass sie in jedes Feld durch alle verschachtelten Ebenen geht. Die json_tree() Funktion durchläuft das JSON, untersucht jedes Teil davon und gibt Ihnen dann eine Tabelle, die jeden von ihr gefundenen Elementen detailliert.

Die json_tree() zeigt die Ergebnisse als eine Reihe von Zeilen, die eine klare Sicht auf auch die komplexesten verschachtelten JSON-Daten bieten. Diese Tabelle gibt Ihnen den Namen jedes Elements, welchen Datentyp es hat, seinen Wert und wo es sich innerhalb der JSON-Struktur befindet.

Diese Abfrage würde also mehrere Zeilen zurückgeben, die die Struktur des JSON-Objekts beschreiben, einschließlich des verschachtelten „Cast“-Felds:

 

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

Das Ergebnis der obigen Abfrage wäre ungefähr so:

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

Mit dem Pfadparameter kann die json_tree() sich auf einen bestimmten Teil der JSON konzentrieren. Wenn Sie der json_tree() einen spezifischen Pfad in der JSON als zweiten Argument geben, beginnt sie dort mit ihrer Erkundung.

Zum Beispiel ignoriert diese Abfrage alles außerhalb des „Cast“-Felds und bietet eine fokussierte Sicht auf diese verschachtelte JSON-Array:

 

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

Das Ergebnis der obigen Abfrage wäre ungefähr so:

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

Interessantes Faktum: Haben Sie jemals die ‚1‘ im URL der offiziellen Dokumentation von JSON in SQLite bemerkt und sich gewundert, ob es eine Geschichte gibt? Als die JSON-Unterstützung zum ersten Mal im Jahr 2015 in SQLite veröffentlicht wurde, erwartete der Schöpfer, dass ‚JSON1‘ nur der Anfang einer Reihe von Versionen sein würde — JSON2, JSON3 und so weiter. Aber der Spaß liegt hier: ‚JSON1‘ war so effektiv und effizient, dass sie nie eine ‚JSON2‘ oder ‚JSON3‘ erstellen mussten. Die ‚1‘ in ‚JSON1‘ ist also nicht nur ein Versionsanzeiger — es ist ein Erfolgszeichen!

3. Praktische Ansätze zur Abfrage beliebig komplexer JSON-Daten in SQLite

Mit SQLite-JSON-Funktionen in Kombination mit integrierten SQLite-Funktionen können Sie komplexere Datenabfragen durchführen. Hier sehen Sie einige dieser Beispiele einschließlich Aggregation, Filtern und Pfadausdrücken.

Wie zu Beginn des Beitrags erwähnt, wäre die JSON-Daten in der movie-Tabelle in den Beispielen für alle verbleibenden Abschnitte wie folgt:

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}

Erstellen von Aggregats-SQL-Abfragen mit JSON-Funktionen in SQLite

Dieser Ansatz beinhaltet die Verwendung von JSON-Funktionen zusammen mit integrierten SQLite-Aggregatfunktionen zur Durchführung von Berechnungen an JSON-Daten. Zum Beispiel können Sie die durchschnittliche Laufzeit eines als Komödie kategorisierten Films mit der folgenden Abfrage berechnen:

 

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';

Das Ergebnis der obigen Abfrage wäre etwa so, da es zwei Filme in der Datenbank gibt mit dem Genre Komödie und ihre Laufzeit 90 und 98 beträgt, also wäre das Durchschnittsergebnis so:

average_runtime
94

JSON-Decodierung und Filtern von Daten mit mehreren Bedingungen

Sie können die json_extract()-Funktion in SQLite zur detaillierten Filterung verwenden, indem Sie sie in der WHERE-Klausel einer SQL-Abfrage einsetzen. Zum Beispiel können Sie Filme basierend auf bestimmten Bedingungen filtern, wie Filme, die zwei oder mehr Cast-Mitglieder haben und eine Rate über einem bestimmten Wert.

 

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;

Das Ergebnis der obigen Abfrage wäre etwa so:

movie_name movie_rate cast_size
The Obsessed’s Fairy 9.5 2

Verwenden von Pfadausdrücken zur Extraktion spezifischer Werte aus JSON-Daten in SQLite

Pfadausdrücke können verwendet werden, um verschachtelte JSON-Daten an einem bestimmten Speicherort zuzugreifen. Dieses Beispiel gibt eine Liste aller movie directors zurück, die einen Film in einem bestimmten Genre, wie Geschichte, inszeniert haben.

 

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

Das Ergebnis der obigen Abfrage wäre beispielsweise:

movie_director
Simone Mikey Bryn

4. So überprüfen Sie das Schema Ihrer JSON-Daten in SQLite

Die Schemacheckung von JSON-Daten in SQLite ist ein Weg, um die Struktur und Konsistenz Ihrer Daten sicherzustellen, künftiges Fehlerhandling zu verbessern und komplexe Datenmanipulation zu vereinfachen. Obwohl SQLite keine integrierten Funktionen für die Schemavalidierung bietet, können Sie seine JSON-Funktionen und die CHECK Funktion hierfür verwenden.

Überprüfen der JSON-Struktur mit den SQLite-Funktionen json_type() und check()

Die json_type() Funktion kann verwendet werden, um den Typ eines Feldes in den JSON-Daten zu überprüfen. Zum Beispiel, auf der Grundlage der vorherigen Erstellung der Filmtabelle, nehmen wir an, bei der Erstellung der Tabelle zum Speichern der JSON-Daten eines Films möchten Sie sicherstellen, dass jeder Eintrag die Felder Name und Jahr hat, wobei Jahr eine ganze Zahl ist. Dafür können Sie eine CHECK()-Einschränkung mit der json_type() Funktion bei der Tabellenerstellung verwenden:

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

Hier json_type() überprüft den Typ der angegebenen Felder in Ihren JSON-Daten, den Namen und das Jahr. Wenn ein neuer Einfügungs- oder Aktualisierungsvorgang versucht, Daten einzufügen, bei denen der Name nicht existiert oder das Jahr keine ganze Zahl ist, wird die CHECK()-Einschränkung fehlschlagen und der Vorgang wird abgelehnt. Dies hilft, die Datenintegrität Ihrer JSON-Daten in der Filmtabelle aufrechtzuerhalten.

Validierung von JSON-Daten mit der json_valid()-Funktion in SQLite

Die json_valid()-Funktion überprüft die Gültigkeit der JSON-Daten aus der Sicht der JSON-Standardformat, bietet also eine Art Schemavalidierung. Um beispielsweise die Integrität der JSON-Daten vor der Einfügung sicherzustellen, können Sie Validierungsprüfungen wie diese anwenden:

 

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

In dieser Anweisung überprüft json_valid(), ob der bereitgestellte JSON-String gültig ist. Wenn ja, werden die Daten in die Filmtabelle eingefügt und wenn nicht, wird der Vorgang übersprungen. Diese Sicherung verhindert die Einfügung von fehlerhaften JSON-Daten.

Betrachten wir ein weiteres Beispiel, das beide Regeln kombiniert, die Einschränkung bei der Erstellungsphase der Filmtabelle und die json_valid()-Überprüfung bei Einfügungen. Betrachten Sie die folgende Abfrage:

 

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

Das Ergebnis dieser Abfrage wäre eine Fehlermeldung „CHECK-Einschränkung fehlgeschlagen“, da der Eingabewert kein Name-Feld hat und das Jahr-Feld keine ganze Zahl ist, sodass die Einfügung fehlschlagen würde, obwohl die bereitgestellten JSON-Daten gültige JSON sind.

Darüber hinaus können Sie zur detaillierteren Schemavalidierung über komplexe und verschachtelte JSON-Daten auch die Python-Bibliothek JSONschema in Betracht ziehen.

5. Wie man verschachtelte JSON-Daten in SQLite verwaltet

Das Navigieren in verschachtelten und hierarchischen JSON-Daten in SQLite kann einige Herausforderungen bieten. SQLite bietet jedoch integrierte JSON-Funktionen, die diesen Prozess vereinfachen und verwaltbar machen. Hier sind einige Strategien zur Verwaltung verschachtelter JSON-Daten in SQLite.

Entfalten von hierarchischen JSON-Daten mithilfe von SQL-Abfragen

Die SQLite-Funktionen json_each() und json_extract() können Ihnen dabei helfen, durch die Schichten verschachtelter JSON-Daten zu navigieren. Betrachten Sie diese Abfrage, die json_each() verwendet, um durch die Daten zu parsen, und json_extract() zur gezielten Extraktion der benötigten Informationen.

Zum Beispiel wird diese Abfrage in das Cast-Array in jedem JSON-Datensatz im data-Feld in der movie-Tabelle eindringen und die movies auflisten, die mehr als 2 Cast-Mitglieder haben:

 

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;

Das Ergebnis der obigen Abfrage wäre in etwa wie folgt:

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

Navigieren durch JSON-Arrays mithilfe von SQL-Abfragen

JSON-Objekte können wichtige Informationen in Form eines Arrays speichern, indem Sie json_tree() und json_extract() kombinieren, können Sie durch diese verschachtelten Arrays iterieren und Daten daraus extrahieren.

Zum Beispiel ruft diese Abfrage den Namen jedes Actor aus dem Cast-Array jedes Film-Datensatzes ab:

 

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%' );

Das Ergebnis dieser Abfrage wäre dies:

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

Auslesen von JSON-Daten mithilfe der json_each()-Funktion in SQLite

Manchmal kann das Vereinfachen von verschachtelten JSON-Strukturen durch Flattening ein praktischer Ansatz sein, um einige komplexe Abfragen gegen JSON-Objekte zu lösen. Die json_tree()-Funktion von SQLite kann zum Flattening von JSON-Objekten verwendet werden.

Zum Beispiel verwendet diese Abfrage json_tree(), um die JSON-Daten in eine Tabelle von Schlüssel-Wert-Paaren umzuwandeln, vollständig flach, die Abfrage würde jede Primärwertart abrufen, indem sie auch durch Arrays und Objekte geht, des ersten Film-Datensatzes:

 

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

Das Ergebnis dieser Abfrage wäre dies:

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

Durch die Anwendung dieser Methoden können Sie JSON-Daten in SQLite effizient parsen, verwalten und decodieren, was unerlässlich ist, wenn es um komplexe JSON-Daten geht.

6. Verwendung von Indizierung für die Abfrageoptimierung bei JSON-Daten in SQLite

Indizierung von JSON-Daten in SQLite ist eine effektive Methode zur Optimierung von Suchoperationen und zur Steigerung der Abfrageleistung, insbesondere für große Datensätze. Durch die Erstellung eines Indexes basierend auf bestimmten JSON-Eigenschaften können Sie Suchoperationen in einer JSON-Spalte erheblich beschleunigen.

Das Prinzip hinter diesem Ansatz ist einfach. Anstatt eine vollständige Tabelle zu durchsuchen und den JSON für jede Zeile zu parsen, was ressourcenintensiv sein kann, kann SQLite den Index nutzen, um schnell die für die Suche relevanten Zeilen zu lokalisieren.

So fügen Sie SQL-Indizierung auf JSON-Daten in SQLite hinzu

Betrachten wir ein praktisches Beispiel mit dem movie-Datensatz. Zum Beispiel, wenn Sie häufig nach Filmen nach ihrem Name suchen, wäre die Erstellung eines Indexes auf dieser Eigenschaft von Vorteil:

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

Hier ist data die Spalte mit den JSON-Daten und movie ist die Tabelle. Die json_extract()-Funktion extrahiert den Name jedes movie-JSON-Datens und SQLite verwendet diesen Wert, um einen Index zu erstellen.

Sobald Sie diese Abfrage ausführen und der Index eingerichtet ist, kann SQLite Daten schnell abrufen, wenn Sie nach einem Film nach seinem Name suchen. Diese Abfrage wäre mit dem idx_name-Index viel schneller. Daher bietet das Hinzufügen von Indizes zu JSON-Daten in SQLite leistungsfähige Optimierungsmöglichkeiten und ist eine effiziente Methode zur Verwaltung großer JSON-Datensätze.

Wie man einen Index auf mehrere Felder von JSON-Daten in SQLite erstellt

Betrachten wir ein weiteres Beispiel, in dem Sie häufig nach spezifischen Daten suchen, die auf mehr als einem Feld basieren. Zum Beispiel, wenn Sie häufig nach Filmen nach Name und Jahr suchen, wäre es von Vorteil, einen Index für diese Eigenschaften gemeinsam zu erstellen. In SQLite könnte dies durch Erstellen eines Index auf einer berechneten Ausdruck erfolgen:

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

Wiederum kann SQLite, wenn dieser Index eingerichtet ist, Daten schnell abrufen, wenn Sie nach einem Film nach Name und Jahr suchen.

7. Json5-Unterstützung in SQLite

Die JSON5 wurde eingeführt, um einige ECMA-kompatible Syntax zu unterstützen und JSON ein wenig besser als Konfigurationssprache zu gestalten. SQLite hat die Unterstützung für die JSON5-Erweiterung in Version 3.42.0 eingeführt. Während SQLite JSON-Texte lesen und interpretieren kann, die JSON5-Erweiterungen enthalten, werden von SQLite’s Funktionen erzeugte JSON-Texte streng der Definition kanonischer JSON entsprechen. Hier sind einige der Hauptmerkmale, die die JSON5-Erweiterung zur JSON-Unterstützung in SQLite hinzufügt.

JSON-Objekte mit Kommentaren in SQLite JSON

JSON5 ermöglicht Einzelzeilenkommentare (//…) und Mehrzeilenkommentare (/…/). Dies kann besonders nützlich sein, um Kontext oder Erklärungen direkt in Ihren JSON-Daten hinzuzufügen. Hier ist ein Beispiel für Kommentare in JSON-Objekten:

 

/* A
multi-line
comment
in JSON5 */

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

Objektschlüssel ohne Anführungszeichen in SQLite JSON

In JSON5 können Objektschlüssel als ungequote Bezeichner verwendet werden, was die JSON-Syntax vereinfacht. Es ist jedoch wichtig zu beachten, dass dies möglicherweise die Kompatibilität mit Systemen einschränkt, die streng die JSON-Standards befolgen.

 
{  key: "value" }

Mehrzeilige Strings in JSON-Objekten

JSON5 unterstützt mehrzeilige Strings, die erreicht werden können, indem Zeilenumbruchzeichen escapen werden. Dies ist nützlich, wenn mit großen Strings oder bei der Formatierung des Strings in einer lesbareren Form gearbeitet wird.

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

Json5 vs. Kanonische JSON-Validierung in SQLite

Hier werden wir die kompletten Validierungstechniken für JSON5 und kanonische JSON-Objekte durchgehen und ihre Unterstützung anhand präziser SQL-Abfragebeispiele in der SQLite-Datenbank erklären.

Um zu bestimmen, ob eine Zeichenfolge gültiges JSON5 ist, können Sie die json_error_position()-Funktion verwenden. Diese Funktion gibt einen Wert ungleich Null zurück, wenn die Zeichenfolge kein wohlgeformtes JSON oder JSON5 ist. Hier ist ein Beispiel:

 

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

Das Ergebnis dieser Abfrage wäre 0, was darauf hinweist, dass hier kein Fehler erkannt wird, obwohl der Schlüssel ungekennzeichnet ist, da dies eine gültige Erweiterung von JSON5 ist.

error_position
0

Andererseits können Sie, um eine JSON5-Zeichenfolge in kanonisches JSON zu konvertieren, die json()-Funktion verwenden. Während diese Funktion JSON5-Eingaben erkennt und verarbeitet, gibt sie nur kanonisches JSON aus. Dies ermöglicht eine Rückwärtskompatibilität mit Systemen, die kanonisches JSON erwarten. Hier ist ein Beispiel:

 

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

Das Ergebnis dieser Abfrage wäre ein kanonisches JSON, das aus dem JSON5-Format konvertiert wurde und den hier gekennzeichneten Schlüssel verwendet:

canonical_json
{„key“: „value“}

Beachten Sie jedoch, dass die json_valid()-Funktion weiterhin false für Eingaben meldet, die kein kanonisches JSON sind, selbst wenn die Eingabe gültiges JSON5 ist. Dies ist bei der Arbeit mit sowohl kanonischem JSON als auch JSON5 in SQLite eine wichtige Unterscheidung. Betrachten Sie beispielsweise die folgende Abfrage:

 

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

Das Ergebnis dieser Abfrage wäre 0, was darauf hinweist, dass dies kein gültiges JSON ist, da es einen ungekennzeichneten Schlüssel hat, was eine Verletzung des kanonischen JSON-Formats ist:

valid_json
{„key“: „value“}

8. Häufige Fehler und Fehlerbehebung bei der Arbeit mit JSON in SQLite

Die Handhabung von JSON-Daten in SQLite beinhaltet einige häufige Fallstricke, die mit einem tieferen Verständnis der spezifischen Mechanismen, wie der korrekten Verwendung von Funktionen, vermieden werden können. Hier sind einige wichtige Überlegungen.

Wie man Syntaxfehler in JSON-Daten während der JSON-Parsungsphase in SQLite behebt

JSON-Daten müssen korrekt formatiert und einer spezifischen Standardsyntax folgen, um in der SQLite-Datenbank verarbeitet und bearbeitet werden zu können. Wenn Ihre JSON-Zeichenfolge fehlerhaft formatiert ist, kann SQLite sie nicht interpretieren, was zu Fehlern führt. Zum Beispiel könnten Sie ungleichmäßige Klammern, falsche Verwendung von Anführungszeichen oder falsch platzierte Kommas haben.

SQLite stellt die json_valid() Funktion zur Validierung von JSON-Zeichenfolgen bereit, wie der Name schon sagt. Die json_valid() Funktion gibt eins zurück, wenn die Eingabe eine wohlgeformte JSON-Zeichenfolge ist, und 0 andernfalls. Hier ist ein Beispiel:

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

Im Falle eines Syntaxfehlers in der JSON-Zeichenfolge kann die json_error_position() Funktion verwendet werden, um die Position im String zu identifizieren, an der der Fehler aufgetreten ist:

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

Falsche Verwendung von JSON-Funktionen bei Abfragen gegen JSON-Daten

Die Fehlverwendung von JSON-Funktionen ist ein weiteres häufiges Problem, weshalb ein solides Verständnis der JSON-Funktionen und ihrer Verwendung in SQLite für eine erfolgreiche Datenbehandlung von entscheidender Bedeutung ist. Zum Beispiel können falsche Pfade oder das Nichtbeachten des nullbasierten Indexsystems von JSON-Arrays in SQLite zu Fehlern oder falschen Datenabrufen führen.

Keine BLOB-Unterstützung in den JSON-Funktionen von SQLite

Es ist wichtig sicherzustellen, dass Sie nicht versuchen, BLOBs mit JSON-Funktionen in SQLite zu verwenden, da alle derzeitigen JSON-Funktionen in SQLite einen Fehler werfen, wenn einer ihrer Argumente ein BLOB ist und nicht gültiges JSON als Eingabe. SQLite unterstützt derzeit keine binäre Kodierung von JSON, obwohl dies eine potenzielle zukünftige Verbesserung sein könnte.

Wie man JSON-Validierung während SQL-Abfragen von JSON-Daten in SQLite durchführt

Die json() Funktion in SQLite wird hauptsächlich verwendet, um die JSON-Formatierung eines Strings durch das Hinzufügen von Anführungszeichen, das Einfügen notwendiger Zeichen usw. durchzusetzen. Die falsche Verwendung der json() Funktion könnte zu einem Mangel an Fehlerbehebung und potenziellen Dateninkonsistenzen führen.

Allerdings ist sie nicht dafür entwickelt, ein JSON zu validieren. Um einen JSON-String zu validieren oder einen Syntaxfehler zu finden, verwenden Sie die json_valid() und json_error_position() Funktionen, wie zuvor diskutiert.

Abschluss

In diesem umfassenden Leitfaden haben wir die kraftvolle Integration von JSON und SQLite durchlebt und Einblicke in die großen Möglichkeiten gewährt, die diese Kombination bietet. Wir begannen mit einer Übersicht über die JSON-Funktionen von SQLite zusammen mit ihren detaillierten Anwendungsfällen und SQL-Abfragebeispielen.

Wir untersuchten fortgeschrittene Abfragetechniken wie die Handhabung hierarchischer JSON-Daten innerhalb von SQLite. Die Reise vertiefte sich in die Mechanismen der Dekodierung und Verwaltung von JSON-Daten, wobei die Nützlichkeit von SQLite-Funktionen wie json_each() und json_tree() hervorgehoben wurde. Wir nahmen auch den Wert der Flachlegung von JSON-Daten für eine effiziente Datenverwaltung in den Blick.

Anschließend ging es in ein wichtiges, oft übersehenes Gebiet über: Leistungssteigerung durch Indizierung. Diese starke Optimierung kann die Abfrageleistung erheblich beschleunigen und Ihr SQLite-Erlebnis mit JSON verbessern. Dann wurde die neue JSON5-Erweiterung diskutiert, die Ihrer JSON-Datenformatierung mehr Flexibilität bringt.

Zuletzt behandelten wir einige häufige Fehler und Fehlerbehebungstipps, um Ihre Reise durch JSON in SQLite zu erleichtern, wobei die Bedeutung korrekter JSON-Syntax und der richtigen Verwendung von SQLite JSON-Funktionen betont wurde.

Denken Sie daran, Lernen und Experimentieren sind der Schlüssel zum Entfesseln des vollen Potenzials von JSON in SQLite. Wenden Sie diese Techniken bei Ihren Projekten an und teilen Sie Ihre Erfahrungen, um anderen auf einer ähnlichen Reise zu helfen. Also, lasst uns weiterhin lernen und Grenzen mit JSON in SQLite überschreiten. Viel Erfolg mit Ihrer JSON-Nutzung!

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