In het vorige artikel, Learning the Basics: How to Use JSON in SQLite, gingen we dieper in op de essentiële JSON-functies van SQLite en hun mogelijkheden. We onderzochten het gebruik van JSON als ongestructureerde gegevens binnen een SQLite-database. Belangrijk is dat we enkele van de noodzakelijke SQLite JSON-functies hebben uitgelegd, met gesprek over hun rol in gegevensopslag en -recuperatie, gevolgd door praktische SQL-queryvoorbeelden. Deze fundamentele kennis over het werken met JSON-gegevens in SQLite stelt het toneel voor uw geavanceerde verkenning van het onderwerp.
Laten we beginnen!
Integratie van SQL en NoSQL-mogelijkheden door volledig te begrijpen hoe JSON te hanteren in SQLite
Het vergroten van uw kennis over SQLite’s JSON-behandelingsmogelijkheden combineert het beste van SQL en NoSQL, biedt een efficiënt, alles-in-één oplossing voor het beheren van gemengde gegevensformaten. JSON-gegevensondersteuning in SQLite zet SQLite om in een krachtbron voor ongestructureerde gegevens, vergelijkbaar met databases zoals MongoDB.
De geavanceerde JSON-integratie van SQLite combineert de flexibiliteit van JSON met de robuustheid van SQLite, ideaal voor de huidige toepassingen met veel data. De JSON-mogelijkheden van SQLite doen meer dan alleen opslaan en opvragen van gegevens. Ze staan SQL-achtige bewerkingen toe op JSON-gegevens, waardoor een brug wordt geslagen tussen gestructureerde en ongestructureerde gegevensbeheer.
Dit handboek richt zich op het aanvullen van uw praktische vaardigheden met de JSON-functies van SQLite middels praktische SQL-queryvoorbeelden. Elk gedeelte is bedoeld om uw begrip te vergroten en u een voorsprong te geven bij het manipuleren van echte JSON-gegevens in SQLite.
Uit het eindresultaat zult u over een uitgebreid arsenaal beschikken voor het aanpakken van elke JSON-gegevensstructuur. U zult leren hoe u indexen kunt toepassen, gegevens kunt opvragen met padexpressies, kunt filteren en zelfs gegevens kunt valideren – essentiële taken voor het aanpakken van dynamische gegevens in gestructureerde omgevingen met behulp van JSON-functies in SQLite.
1. Hoe JSON te integreren binnen SQLite
De ingebouwde JSON-functies van SQLite spelen een cruciale rol bij het integreren van JSON en SQLite. Vanaf SQLite-versie 3.38.0, uitgebracht op 2022-02-22, zijn JSON-functies standaard opgenomen, terwijl ze daarvoor een extensie waren. Dit betekent dat deze JSON-functies in SQLite voor deze versie optioneel waren, terwijl ze nu standaard beschikbaar zijn en kunnen worden uitgeschakeld door een compileeroptie in te stellen, mocht u ze nodig hebben uit te schakelen.
U kunt JSON-gegevens in SQLite importeren met eenvoudige INSERT-SQL-query’s. U kunt alternatief ook derdenhulpmiddelen of scripts gebruiken om in bulk uitgebreide JSON-datasets te importeren ook. Om JSON-gegevens te extraheren, kunt u de json_extract()-functie gebruiken die waarden ophaalt die zijn gekoppeld aan een specifieke sleutel uit een JSON-gegevenskolom.
2. SQLite JSON-functies gebruiken voor geavanceerde JSON-decodering en SQL-query’s
In deze sectie gaan we geavanceerde JSON-functies en hun mogelijkheden in SQLite onderzoeken, met SQL-query-voorbeelden voor elk. Gedurende deze blogpost gebruiken we gegenereerd JSON-gegevens, genoemd movie, als referentie die als onderzocht gegevens gebruikt zal worden:
U kunt de gegevens invoeren in een tabel met de naam movie met één veld genaamd data, en beginnen met het uitvoeren van deze voorbeeldquery’s ertegen. In de volgende query’s gaan we de invoerteksten van JSON-functies gebruiken, om duidelijk te zijn over de uitleg van de functies, en vervolgens gaan we terug naar de ingevoerde gegevens in de database, te beginnen vanaf sectie 3.
Voor de eenvoud in dit voorbeeld gaan we een eenvoudigere versie van de eerste JSON-gegevens gebruiken:
{
"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."
}
Foutdetectie met de json_error_position()
functie in SQLite
De json_error_position() functie kan worden gebruikt om eventuele fouten in de syntaxis van uw JSON-gegevens te detecteren. Als de invoerstring een geldig JSON is, geeft het 0 terug, anders geeft het de tekenpositie van de eerste fout.
Bijvoorbeeld, als u een ontbonden JSON-string als invoer van deze functie heeft, zoals deze:
SELECT
json_error_position ( '{"Name":"Naked of Truth","Year":1979,' ) AS err_position
Het resultaat van het uitvoeren van deze query zou de positie van de foutsyntaxis zijn die is opgetreden, in dit geval is dat de positie van de ontbrekende “}” aan het einde:
error_position |
---|
38 |
Fusie van JSON-objecten met de json_patch()
functie in SQLite
De json_patch() functie combineert 2 JSON-objecten, waardoor het mogelijk is om JSON-objecten toe te voegen, te wijzigen en te verwijderen.
Bijvoorbeeld, deze query zou de 2 JSON-inputs combineren tot 1 JSON:
SELECT
json_patch ( '{"Name":"Naked of Truth"}', '{"Year": 2011}' ) AS patched_json;
Het resultaat zou er zo uit zien, een JSON-object dat is opgebouwd uit beide velden:
patched_json |
---|
{“Name”:”Naked of Truth”,”Year”:2011} |
Manipuleer JSON-velden met behulp van de json_set()
functie in SQLite
De json_set() functie wordt gebruikt om JSON-eigenschappen toe te voegen of te vervangen. json_set()
neemt een JSON-string als eerste argument, gevolgd door nul of meer paren van pad/waarde-argumenten. Het resultaat zou een JSON-string zijn die is gemaakt door waarden toe te voegen of te vervangen op basis van de opgegeven pad- en waarde-paren.
Bijvoorbeeld, bouwend op de JSON-gegevens van de vorige query, als u een Director
veld wilt toevoegen aan de JSON-gegevens, kunt u een query zoals deze schrijven:
SELECT
json_set ( '{"Name":"Naked of Truth","Year":2011}', '$.Director', 'Ellynn OBrien' ) AS json_data;
En het resultaat zou er zo uitzien:
json_data |
---|
{“Name”:”Naked of Truth”,”Year”:2011,”Director”:”Ellynn OBrien”} |
De json_quote()
functie in SQLite
De json_quote() functie is een eenvoudige functie die gewoon de invoerwaarde omwikkelt met dubbele aanhalingstekens om het een geldig JSON-string te maken. Hier is een eenvoudig queryvoorbeeld ervan:
SELECT
json_quote ( 'Naked Of Truth' ) AS valid_json_string;
En het resultaat zou er ongeveer zo uitzien:
valid_json_string |
---|
“Naked of Truth” |
Hoe te gebruiken json_group_object()
en json_group_array()
JSON-functies in SQLite voor aggregatie
Voor deze set JSON-functies in SQLite moeten we het voorbeeld JSON-gegevens uitbreiden in vergelijking met de vorige voorbeelden om het gebruiksgeval van elke functie op een begrijpbare manier te demonstreren. Stel dat dit je movie
tabel in de database is met één veld genaamd data
, zoals eerder vermeld:
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} |
De json_group_array()
Aggregatiefunctie met SQL-queryvoorbeeld
De json_group_array() functie, vergelijkbaar met andere aggregatiefuncties in SQLite, groepeert meerdere rijen gegevens in één JSON-array.
Bijvoorbeeld, deze query zou een JSON-array teruggeven met de namen van alle films met een Beoordeling groter dan 6:
SELECT
json_group_array ( json_extract ( data, '$.Name' ) ) AS movie_names
FROM
movie
WHERE
json_extract ( data, '$.Rate' ) > 6
En het resultaat zou er ongeveer zo uitzien:
movie_names |
---|
[“Forgotten in the Planet”, “The Obsessed’s Fairy”] |
De json_group_object()
JSON-functie met SQL-queryvoorbeeld
De json_group_object() functie creëert een JSON-object door twee kolommen van een query te groeperen, waarbij de eerste kolom wordt gebruikt als sleutel en de tweede als waarde. De eerste zal worden gebruikt als de sleutelnaam van de JSON-velden en de tweede als hun waarden.
Bijvoorbeeld, deze query zal een JSON-object teruggeven waarvan de naam van elk veld een film-ID is en de waarde van het veld de corresponderende Naam als de film
een Cijfer groter dan 6 heeft, wat de laatste film uitsluit:
SELECT
json_group_object ( json_extract ( Data, '$.ID' ), json_extract ( Data, '$.Name' ) ) AS movie_rates
FROM
movie
WHERE
json_extract ( Data, '$.Rate' ) > 5
Het resultaat zou er zo uit zien, een JSON-object dat bestaat uit de ID en Naam van de eerste en tweede films omdat ze een Cijfer
groter dan 5 hebben:
movie_rates |
---|
{“1”: “Forgotten in the Planet”,”2″:”The Obsessed’s Fairy”} |
JSON-gegevens parseren met json_each()
en json_tree()
tabelwaardige functies in SQLite
SQLite biedt twee krachtige tabelwaardige functies om te werken met uw JSON-gegevens, json_each()
en json_tree()
. Ze hebben variaties met en zonder het pad-parameter, waardoor u met uw JSON op verschillende dieptes kunt interageren.
Stel dat dit de enige JSON-waarde is die in het data-veld van de filmtabel in de SQLite-database is ingevoegd, laten we beginnen met het uitleggen van de aggregate functies erop:
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 } |
De json_each()
functie in SQLite met SQL-queryvoorbeeld
De json_each() functie breekt een JSON-object in rijen, waarbij elke rij een veld in het JSON-object vertegenwoordigt, alleen door level 1 van geneste JSON-velden.
Bijvoorbeeld, deze query zou 8 rijen teruggeven voor elk veld in de JSON-gegevens:
SELECT
key,
value,
type
FROM
movie,
json_each ( data )
Het resultaat zou er zo uitzien, waarbij de sleutel en waarden van elk veld in de JSON als rij worden vermeld. Zoals je ziet, worden de arrayvelden Genre
en Cast
zoals ze zijn weergegeven, en ging de functie niet in op hen om de tweede niveau items te vermelden:
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 |
De json_tree()
functie in SQLite met SQL-queryvoorbeeld
De json_tree() functie wordt gebruikt om JSON-gegevens volledig te doorlopen en te parseren, wat betekent dat het in elk veld door alle geneste niveaus gaat. De json_tree()
functie doorloopt de JSON, onderzoekt elk deel ervan en geeft je vervolgens een tabel die elk element dat het gevonden heeft in detail beschrijft.
De json_tree()
toont de resultaten als een reeks rijen, waardoor zelfs de meest complexe geneste JSON-gegevens duidelijk in beeld worden gebracht. Deze tabel vertelt u de naam van elk element, wat voor soort gegevens het is, de waarde ervan en waar het zich bevindt binnen de JSON-structuur.
Dus deze query zou meerdere rijen teruggeven, die de structuur van het JSON-object beschrijven, inclusief het geneste Cast-veld:
SELECT
key,
value,
type
FROM
movie,
json_tree ( data )
Het resultaat van bovenstaande query zou ongeveer zo uitzien:
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 |
Met de padparameter kan json_tree()
zich richten op een specifiek deel van de JSON. Geef je json_tree()
een specifiek pad in de JSON als tweede argument, dan begint het zijn verkenning vanaf dat punt.
Bijvoorbeeld, deze query negeert alles buiten het Cast-veld, waardoor een gefocuste weergave van deze geneste JSON-array wordt geboden:
SELECT
key,
value,
type
FROM
movie,
json_tree ( data, '$.Cast' )
Het resultaat van bovenstaande query zou ongeveer zo uitzien:
key | Value | Type |
---|---|---|
0 | Adrian Gratianna | text |
1 | Tani O’Hara | text |
2 | Tessie Delisle | text |
Leuke feit: Heb je je ooit afgevraagd waarom er een ‘1’ in de URL van de officiële documentatie van JSON in SQLite staat en of het een verhaal heeft? Toen de ondersteuning voor JSON voor het eerst in SQLite werd uitgebracht in 2015, verwachtte de maker dat ‘JSON1’ slechts het eerste deel zou zijn van een reeks versies—JSON2, JSON3, enzovoort. Maar het leuke is: ‘JSON1’ was zo effectief en efficiënt dat er nooit een ‘JSON2’ of ‘JSON3’ hoefde te worden gemaakt. Dus de ‘1’ in ‘JSON1’ is niet alleen een versienummer—het is een teken van succes!
3. Praktische benaderingen om elke complexe JSON-gegevens in SQLite te queryn
Met behulp van SQLite’s JSON-functies in combinatie met SQLite’s ingebouwde functies kun je complexere gegevensquery’s uitvoeren. Hier zie je enkele van deze voorbeelden, inclusief aggregatie, filteren en padexpressies.
Zoals eerder vermeld aan het begin van de post, zou de JSON-gegevens in de movie
tabel in de voorbeelden voor alle overige secties er zo uitzien:
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} |
Het samenstellen van samenvattende SQL-query’s met JSON-functies in SQLite
Deze aanpak houdt het gebruik van JSON-functies in samen met SQLite’s ingebouwde aggregatiefuncties om berekeningen uit te voeren op JSON-gegevens. Je kunt bijvoorbeeld het gemiddelde van de speelduur van de film die is gecategoriseerd als Komedie berekenen met behulp van de volgende query:
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';
Het resultaat van de bovenstaande query zou er zo uitzien, aangezien er twee films in de database zijn met het genre Komedie, en hun speelduur 90 en 98 is, dus het gemiddelde hiervan zou er zo uitzien:
average_runtime |
---|
94 |
JSON-decodering en filteren van gegevens met meerdere voorwaarden
Je kunt de json_extract()
functie in SQLite gebruiken voor gedetailleerd filteren door deze te gebruiken in de WHERE
clausule van een SQL-query. Je kunt bijvoorbeeld films filteren op specifieke voorwaarden, zoals films met twee of meer Cast-leden en een Rate
hoger dan een bepaalde waarde.
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;
Het resultaat van de bovenstaande query zou er zo uitzien:
movie_name | movie_rate | cast_size |
---|---|---|
The Obsessed’s Fairy | 9.5 | 2 |
Het gebruik van padexpressies om specifieke waarden uit JSON-gegevens in SQLite te extraheren
Paduitdrukkingen kunnen worden gebruikt om genest JSON-gegevens op die specifieke locatie te openen. Dit voorbeeld retourneert een lijst van alle movie
directors
die een film in een bepaalde Genre, zoals Geschiedenis, hebben geregisseerd.
SELECT DISTINCT
json_extract ( data, '$.Director' ) AS movie_director
FROM
movie,
json_each ( json_extract ( data, '$.Genre' ) )
WHERE
value = 'History';
Het resultaat van de bovenstaande query zou ongeveer zo zijn:
movie_director |
---|
Simone Mikey Bryn |
4. Hoe u het schema van uw JSON-gegevens in SQLite kunt controleren
Schema controleren van JSON-gegevens in SQLite is een manier om de structuur en consistentie van uw gegevens te garanderen, toekomstige foutafhandeling te verbeteren en complexe gegevensmanipulatie te vereenvoudigen. Hoewel SQLite geen ingebouwde functies voor schema validatie heeft, kunt u deze doelstelling bereiken met behulp van de JSON-functies en de CHECK functie.
Controleren van JSON-structuur met json_type()
en check()
SQLite-functies
De json_type()
functie kan worden gebruikt om het type van een veld in de JSON-gegevens te controleren. Bijvoorbeeld, gebouwd op de vorige creatie van de movie-tabel, stel dat bij het aanmaken van de tabel om JSON-gegevens van een film op te slaan, u ervoor wilt zorgen dat elke ingang de velden Naam en Jaar heeft, met Jaar als een integer. Hiervoor kunt u een CHECK() constraint gebruiken met de json_type()
functie bij het aanmaken van de tabel:
CREATE TABLE movie ( data TEXT CHECK ( json_type ( data, '$.Name' ) IS NOT NULL AND json_type ( data, '$.Year' ) = 'integer' ) );
Hier json_type()
controleert het type van de opgegeven velden in uw JSON-gegevens, de Naam en het Jaar. Als een nieuwe insertie of update-operatie probeert gegevens toe te voegen waar Naam niet bestaat of Jaar geen integer is, zal de CHECK() constraint falen en de operatie worden afgewezen. Dit helpt de gegevensintegriteit van uw JSON-gegevens in de tabel Film te handhaven.
Validatie van JSON-gegevens met behulp van de json_valid()
functie in SQLite
De json_valid()
functie controleert de geldigheid van de JSON-gegevens vanuit het perspectief van de JSON-standaardindeling, biedt een mate van schemavalidatie. Bijvoorbeeld, om de integriteit van de JSON-gegevens te waarborgen voor insertie, kunt u validatiecontroles toepassen zoals deze:
INSERT INTO movie ( data ) SELECT
'{"Name":"Naked of Truth","Year":1979}' AS movie_input
WHERE
json_valid ( movie_input );
In deze verklaring controleert json_valid()
of de verstrekte JSON-tekenreeks geldig is. Als dat zo is, wordt de gegevens ingevoegd in de tabel Film en als dat niet zo is, wordt de operatie overgeslagen. Deze bescherming voorkomt de invoer van misvormde JSON-gegevens.
Laten we een ander voorbeeld beschouwen dat de twee regels combineert, de beperking in de creatiefase van de tabel Film en de json_valid()
controle bij invoegingen. Overweeg de volgende query:
INSERT INTO movie ( data ) SELECT
'{"Year":"1979"}' AS movie_input
WHERE
json_valid ( movie_input );
Het resultaat van deze query zou een foutbericht “CHECK constraint failed” zijn, omdat de ingevoerde waarde geen Naamveld heeft en het Jaarveld geen integer is, dus de insert zou falen, ook al is de verstrekte JSON-gegevens een geldige JSON.
Bovendien, voor betere en grondige schemavalidatie over gecompliceerde en geneste JSON-gegevens, kun je overwegen Python’s JSONschema bibliotheek ook te gebruiken.
5. Hoe te beheren geneste JSON-gegevens in SQLite
Het navigeren door geneste en hiërarchische JSON-gegevens in SQLite kan enkele uitdagingen opleveren. Echter, SQLite’s ingebouwde JSON-functies vereenvoudigen dit proces en maken het beheerbaar. Hier zie je enkele strategieën om geneste JSON in SQLite te beheren.
Ontdoen van hiërarchische JSON-gegevens met SQL-query’s
SQLite’s json_each()
en json_extract()
functies kunnen je helpen door de lagen van geneste JSON-gegevens te navigeren. Overweeg deze query die json_each()
gebruikt om door de gegevens te parseren en json_extract()
om selectief de vereiste informatie te trekken.
Bijvoorbeeld, deze query zal in de Cast-array in elke JSON-record in het data
veld in de movie
tabel graven, en zal de movies
opsommen die meer dan 2 Cast
leden hebben:
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;
Het resultaat van de bovenstaande query zou zoiets zijn:
key | movie_name | movie_year | cast_size |
---|---|---|---|
Simone Mikey Bryn | Forgotten in the Planet | 1970 | 3 |
Doorzoeken van JSON Arrays met SQL-query’s
JSON-objecten kunnen belangrijke informatie bevatten in de vorm van een array, door het gebruik van json_tree()
en json_extract()
in combinatie, kun je door deze geneste arrays heen itereren en gegevens uit hen extraheren.
Bijvoorbeeld, deze query haalt de naam van elke Actor
op uit de Cast-array van elke filmrecord:
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%' );
Het resultaat van deze query zou dit zijn:
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 |
Vlakmaken van JSON-gegevens met behulp van de json_each()
functie in SQLite
Soms kan het vereenvoudigen van geneste JSON-structuren door vlakmaken een praktische aanpak zijn om enkele complexe query’s tegen JSON-objecten op te lossen. SQLite’s json_tree()
functie kan worden gebruikt voor het vlakmaken van JSON-objecten.
Bijvoorbeeld, deze query gebruikt json_tree()
om de JSON-gegevens om te zetten in een tabel van sleutel-waardeparen, volledig gevlakt, de query zou elke primaire waardetype ophalen, door arrays en objecten heen, van het eerste filmrecord:
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
Het resultaat van deze query zou dit zijn:
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 |
Door deze methoden te gebruiken, kun je efficiënt parseren, beheren en decoderen van JSON-gegevens in SQLite, wat onschatbaar is bij het omgaan met complexe JSON-gegevens.
6. Hoe Indexering te gebruiken voor Query-optimalisatie over JSON-gegevens in SQLite
Indexeren van JSON-gegevens in SQLite is een effectieve manier om zoekoperaties te optimaliseren en queryprestaties te verbeteren, vooral voor grote datasets. Door een index te maken op basis van bepaalde JSON-eigenschappen, kunt u zoekoperaties op een JSON-kolom aanzienlijk versnellen.
Het principe achter deze aanpak is eenvoudig. In plaats van een volledige tabelscan uit te voeren en de JSON voor elke rij te parseren, wat kan zijn bevoorradingskosten, kan SQLite de index gebruiken om snel de rijen van belang te lokaliseren.
Hoe SQL-indexering op JSON-gegevens in SQLite toevoegen
Laten we een praktisch voorbeeld bekijken met de film
dataset. Als u bijvoorbeeld vaak naar films zoekt op basis van hun Naam
, zou het een index op deze eigenschap zijn:
CREATE INDEX idx_name ON movie ( json_extract ( data, '$.item.Name' ) );
Hier is de gegevens
de kolom met de JSON-gegevens en de film
is de tabel. De json_extract()
functie extraheert de Naam
van elke film
’s JSON-gegevens en SQLite gebruikt deze waarde om een index te maken.
Eens je deze query uitvoert en de index is ingesteld, kan SQLite snel gegevens ophalen wanneer je naar een film vraagt op basis van zijn Naam
. Deze query zou veel sneller zijn met de idx_naam index in plaats daarvan. Daarom bieden indexering toe te voegen aan JSON-gegevens in SQLite krachtige optimalisatie mogelijkheden, waardoor het een efficiënte manier is om grote JSON-datasets te beheren.
Hoe één index op meerdere velden van JSON-gegevens in SQLite te creëren
Laten we een ander voorbeeld bekijken waarin je vaker specifieke gegevens opzoekt op basis van meer dan één veld. Als je bijvoorbeeld vaak films
zoekt op basis van Naam en Jaar, zou het nuttig zijn om een index op deze eigenschappen samen te creëren. In SQLite kan dit worden gedaan door een index te creëren op een berekende expressie:
CREATE INDEX idx_name_year ON movie ( json_extract ( data, '$.Item.Name' ), json_extract ( data, '$.Item.Year' ) );
Nogmaals, wanneer deze index is ingesteld, kan SQLite snel gegevens ophalen wanneer je naar een film vraagt op basis van Naam en Jaar.
7. Ondersteuning voor Json5 in SQLite
De JSON5 werd geïntroduceerd om enkele ECMA-compatibele syntax te ondersteunen en JSON een beetje meer geschikt te maken om als configuratielaag te worden gebruikt. SQLite heeft de JSON5-extensie ondersteuning geïntroduceerd in versie 3.42.0. Hoewel SQLite JSON-tekst kan lezen en interpreteren die JSON5-extensies bevat, zullen alle JSON-teksten die SQLite’s functies genereren strikt aan de definitie van canoniek JSON voldoen. Hier zijn enkele van de belangrijkste functies die de JSON5-extensie toevoegt aan de JSON-ondersteuning in SQLite.
JSON-objecten met opmerkingen in SQLite JSON
JSON5 biedt ondersteuning voor enkelvoudige (//…) en meerlijnige (/…/) opmerkingen. Dit kan bijzonder handig zijn voor het toevoegen van context of uitleg rechtstreeks binnen uw JSON-gegevens. Hier is een voorbeeld van opmerkingen in JSON-objecten:
/* A
multi-line
comment
in JSON5 */
{
"key": "value" // A single-line comment in JSON5
}
Objectsleutels zonder aanhalingstekens in SQLite JSON
In JSON5 kunnen objectsleutels ongequoteerde identifiers zijn, waardoor uw JSON-syntaxis wordt vereenvoudigd. Het is echter belangrijk op te merken dat dit compatibiliteit kan beperken met systemen die strikt de JSON-standaarden volgen.
{ key: "value" }
Meerlijnige strings in JSON-objecten
JSON5 ondersteunt meerlijnige strings, die kunnen worden bereikt door nieuwe regel teken te escape. Dit is handig bij het hanteren van grote strings of bij het formateren van de string in een leesbarere vorm.
{ key: "This is a \\\\\\\\ multiline string" }
Json5 vs. Canonieke JSON-validatie in SQLite
Hier gaan we door de volledige validatietechnieken voor JSON5 en canonieke JSON-objecten, waarbij we hun ondersteuning uitleggen met behulp van precieze SQL-queryvoorbeelden in de SQLite-database.
Om te bepalen of een string geldig JSON5 is, kun je de json_error_position()
functie gebruiken. Deze functie geeft een niet-nulwaarde terug als de string geen goedgevormd JSON of JSON5 is. Hier is een voorbeeld:
SELECT
json_error_position ( '{ key: "value"}' ) AS error_position;
Het resultaat van deze query zou 0 zijn, wat aangeeft dat er geen fout wordt gedetecteerd, ook al is de sleutel ongemarkeerd omdat dit een geldige extensie is van JSON5.
error_position |
---|
0 |
Aan de andere kant, om een JSON5-string om te zetten in canonieke JSON, kun je de json()
functie gebruiken. Hoewel deze functie JSON5-input herkent en verwerkt, zal het alleen canonieke JSON produceren. Dit zorgt voor achterwaartse compatibiliteit met systemen die canonieke JSON verwachten. Hier is een voorbeeld:
SELECT
JSON ( '{key: "value"}' ) AS canonical_json;
Het resultaat van deze query zou een canonieke JSON zijn, geconverteerd uit het JSON5-formaat, waardoor de sleutel hier gemarkeerd is:
canonical_json |
---|
{“key”: “value”} |
Let er echter op dat de json_valid()
functie verder false zal blijven rapporteren voor invoer die geen canonieke JSON is, zelfs als de invoer geldig JSON5 is. Dit is een belangrijk onderscheid bij het werken met zowel canonieke JSON als JSON5 in SQLite. Bijvoorbeeld, overweeg de volgende query:
SELECT
json_valid ( '{key: "value"}' ) AS valid_json;
Het resultaat van deze query zou 0 zijn, wat aangeeft dat dit geen geldig JSON is omdat het een ongemarkeerde sleutel heeft, wat een schending is van het canonieke JSON-formaat:
valid_json |
---|
{“key”: “value”} |
8. Algemene fouten en probleemoplossing bij het werken met JSON in SQLite
Het verwerken van JSON-gegevens in SQLite brengt enkele veelvoorkomende valkuilen met zich mee die kunnen worden vermeden met een dieper begrip van de specifieke mechanismen, zoals het correct gebruik van functies. Hier zijn enkele belangrijke overwegingen.
Hoe Syntaxfouten in JSON-gegevens te debuggen tijdens de JSON-parsingfase van SQLite
JSON-gegevens moeten correct zijn gefomateerd en aan een specifieke standaardsyntaxis voldoen om te worden geparsteerd en verwerkt in de SQLite-database. Als uw JSON-string onjuist gefomateerd is, kan SQLite het niet interpreteren, wat resulteert in fouten. Bijvoorbeeld, u kan haakjes die niet overeenkomen hebben, een incorrect gebruik van aanhalingstekens, of verkeerd geplaatste komma’s.
SQLite biedt de json_valid()
functie voor het valideren van JSON-string, zoals de naam al aangeeft. De json_valid()
functie retourneert één als de invoer een goed gevormde JSON-string is en 0 anders. Hier is een voorbeeld:
SELECT json_valid('{"Name":"Naked of Truth","Year":1979}');
In het geval van een syntaxfout in de JSON-string, kan de json_error_position()
functie worden gebruikt om de positie in de string te identificeren waar de fout heeft plaatsgevonden:
SELECT json_error_position('{"Name":"Naked of Truth","Year":1979}');
Incorrect gebruik van JSON-functies bij het uitvoeren van query’s tegen JSON-gegevens
Het misbruik van JSON-functies is een ander veelvoorkomend probleem, dus het waarborgen van een solide kennis van de JSON-functies en hun gebruik in SQLite is cruciaal voor succesvolle gegevensverwerking. Bijvoorbeeld, het gebruik van een verkeerde pad of het niet in rekening brengen van het nul-gebaseerde indexsysteem van JSON-arrays in SQLite kan leiden tot fouten of incorrecte gegevensophaal.
Geen BLOB-Ondersteuning in SQLite’s JSON-Functies
Het is belangrijk ervoor te zorgen dat u geen poging doet om BLOBs te gebruiken met JSON-functies in SQLite, omdat alle JSON-functies in SQLite momenteel een fout genereren als een van hun argumenten BLOBs zijn en geen geldig JSON als invoer. SQLite ondersteunt momenteel geen enkele binaire codering van JSON, hoewel dit een mogelijke toekomstige verbetering is.
Hoe JSON te Valideren Tijdens SQL-Querying van JSON-Gegevens in SQLite
De json()
functie in SQLite wordt voornamelijk gebruikt om de JSON-indeling van een string te handhaven door aanhalingstekens toe te voegen, noodzakelijke tekens te escape, enz. Het verkeerd gebruik van de json()
functie kan resulteren in een gebrek aan foutopsporing en mogelijke gegevensinconsistenties.
Echter, het is niet ontworpen om een JSON te valideren. Voor het valideren van een JSON-string of het vinden van een syntaxisfout, gebruik de json_valid()
en json_error_position()
functies zoals eerder besproken.
Afsluiten
In deze uitgebreide gids hebben we een reis gemaakt door de krachtige integratie van JSON en SQLite, met inzicht in de enorme kansen die deze combinatie biedt. We begonnen met een overzicht van SQLite’s JSON-functies, samen met hun gedetailleerde gebruiksgevallen met SQL-queryvoorbeelden.
We hebben geavanceerde querytechnieken onderzocht, zoals het afhandelen van hiërarchische JSON-gegevens binnen SQLite. De reis ging dieper in op de mechanica van het decoderen en beheren van JSON-gegevens, waarbij de bruikbaarheid van SQLite-functies als json_each()
en json_tree()
werd benadrukt. We hebben ook de waarde van het plat maken van JSON-gegevens voor efficiënt gegevensbeheer aangekaart.
Vervolgens zijn we overgestapt op een belangrijk gebied dat vaak over het hoofd wordt gezien: prestatieverbetering via indexing. Deze krachtige optimalisatie kan de queryprestaties aanzienlijk versnellen en uw SQLite-ervaring met JSON verbeteren. Het nieuwste-leeftijds JSON5-extensie werd toen besproken, waardoor u meer flexibiliteit krijgt in uw JSON-gegevensindeling.
Tot slot hebben we enkele veelvoorkomende fouten en probleemoplossings tips aangepakt om uw reis door JSON in SQLite te vergemakkelijken, waarbij de belangrijkheid van correcte JSON-syntaxis en het juiste gebruik van SQLite JSON-functies wordt bevestigd.
Onthoud, leren en experimenteren zijn de sleutels tot het ontgrendelen van het volledige potentieel van JSON in SQLite. Terwijl u deze technieken op uw projecten toepast, deel dan uw ervaringen om anderen op een soortgelijke reis te helpen. Dus laten we doorgaan met leren en grenzen verleggen met JSON in SQLite. Veel plezier met het gebruik van JSON!
Source:
https://dzone.com/articles/how-to-master-advanced-json-querying-in-sqlite