No artigo anterior, Learning the Basics: How to Use JSON in SQLite, mergulhamos nas funções JSON essenciais do SQLite e suas capacidades. Exploramos o uso do JSON como dados não estruturados em um banco de dados SQLite. Essencialmente, detalhamos algumas das funções JSON necessárias do SQLite, discutindo seu papel na armazenagem e recuperação de dados, seguido de exemplos práticos de consultas SQL. Essa compreensão fundamental de como trabalhar com dados JSON no SQLite estabelece o cenário para sua exploração avançada do tópico.
Vamos começar!
Integrando Capacidade SQL e NoSQL Ao Dominar Totalmente o Tratamento de JSON no SQLite
Avançar seus conhecimentos sobre as capacidades de tratamento de JSON do SQLite combina o melhor do SQL e NoSQL, proporcionando uma solução eficiente, multifuncional para gerenciar formatos de dados mistos. O suporte a dados JSON no SQLite transforma o SQLite em uma força motriz para dados não estruturados, semelhante a bancos de dados como MongoDB.
A integração avançada de JSON do SQLite reúne a flexibilidade do JSON com a robustez do SQLite, ideal para aplicativos atuais com grande quantidade de dados. As capacidades JSON do SQLite vão além de simplesmente armazenar e recuperar dados. Eles permitem operações semelhantes a SQL em dados JSON, criando uma ponte entre a gestão de dados estruturados e não estruturados.
Este guia se concentra em enriquecer seus conjuntos de habilidades práticas com as funções JSON do SQLite através de exemplos práticos de consultas SQL. Cada seção tem como objetivo aumentar sua compreensão e dar-lhe uma vantagem inicial na manipulação de dados JSON no mundo real no SQLite.
No final, você estará bem equipado com o conjunto de ferramentas disponíveis para manipulação de dados JSON no SQLite para lidar com qualquer estrutura de dados JSON. Você aprenderá sobre como aplicar índices, consultar com expressões de caminho, filtrar e até mesmo validar dados – tarefas essenciais para lidar com dados dinâmicos em ambientes estruturados usando funções JSON no SQLite.
1. Como Integrar JSON Dentro do SQLite
As funções integradas de JSON no SQLite desempenham um papel crucial na integração de JSON e SQLite. A partir da versão 3.38.0 do SQLite, lançada em 2022-02-22, as funções JSON estão incluídas por padrão, enquanto antes eram uma extensão. Isso significa que, antes desta versão, essas funções JSON no SQLite eram opcionais, enquanto agora estão disponíveis por padrão e podem ser desativadas optando por definir uma opção de compilação, caso seja necessário desabilitá-las.
Você pode importar dados JSON no SQLite usando consultas SQL de inserção simples. Alternativamente, você também pode utilizar ferramentas de terceiros ou técnicas de script para importar conjuntos extensos de dados JSON em massa. Para extrair dados JSON, você pode aproveitar a função json_extract(), que busca valores associados a uma chave específica em uma coluna de dados JSON.
2. Aproveitando as Funções JSON do SQLite para Decodificação Avançada de JSON e Consulta SQL
Nesta seção, vamos explorar funções avançadas de JSON e suas capacidades no SQLite, usando exemplos de consultas SQL para cada uma. Ao longo deste post de blog, vamos usar dados de JSON gerados aleatoriamente, chamados de filme, como referência para ser usada como dados examinados:
Você pode inserir os dados em uma tabela chamada filme com um campo chamado dados e começar a executar essas consultas de exemplo a partir de agora contra ela. Nas consultas a seguir, vamos usar os textos de entrada das funções JSON, para ser direto sobre a explicação das funções, e então retornaremos aos dados inseridos no banco de dados a partir da seção 3.
Por motivos de simplicidade neste exemplo, vamos usar uma versão mais simples dos primeiros dados de 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."
}
Detecção de Erros com a Função json_error_position()
no SQLite
A função json_error_position() pode ser usada para detectar qualquer erro na sintaxe dos seus dados JSON. Se a string de entrada for um JSON válido, retornará 0, caso contrário, retornará a posição do caractere do primeiro erro.
Por exemplo, se você tiver uma string JSON quebrada como entrada desta função, como esta:
SELECT
json_error_position ( '{"Name":"Naked of Truth","Year":1979,' ) AS err_position
O resultado de executar esta consulta seria a posição do erro de sintaxe que ocorreu, que neste caso é a posição do “}” faltando no final:
error_position |
---|
38 |
Mesclar Objetos JSON com a Função json_patch()
no SQLite
A função json_patch() mescla 2 objetos JSON, permitindo adicionar, modificar e deletar objetos JSON.
Por exemplo, esta consulta combinaria as 2 entradas JSON em 1 JSON:
SELECT
json_patch ( '{"Name":"Naked of Truth"}', '{"Year": 2011}' ) AS patched_json;
O resultado seria algo como isto, um objeto JSON construído a partir dos dois campos:
patched_json |
---|
{“Name”:”Naked of Truth”,”Year”:2011} |
Manipular Campos JSON Usando a Função json_set()
no SQLite
A função json_set() é usada para adicionar ou substituir propriedades JSON. json_set()
recebe uma string JSON como seu primeiro argumento, seguida por zero ou mais pares de argumentos de caminho/valor. O resultado seria uma string JSON criada a partir da adição ou substituição de valores com base nos pares de caminho e valor fornecidos.
Por exemplo, construindo sobre os dados JSON da consulta anterior, se você deseja adicionar um campo Director
aos dados JSON, você pode escrever uma consulta como esta:
SELECT
json_set ( '{"Name":"Naked of Truth","Year":2011}', '$.Director', 'Ellynn OBrien' ) AS json_data;
E o resultado seria algo como isto:
json_data |
---|
{“Name”:”Naked of Truth”,”Year”:2011,”Director”:”Ellynn OBrien”} |
A Função json_quote()
no SQLite
A função json_quote() é simples, ela apenas envolve o valor de entrada com aspas duplas para torná-lo uma string JSON válida. Aqui está um exemplo simples de consulta:
SELECT
json_quote ( 'Naked Of Truth' ) AS valid_json_string;
E o resultado seria algo assim:
valid_json_string |
---|
“Naked of Truth” |
Como Usar json_group_object()
e json_group_array()
Funções JSON em SQLite para Agregação
Para este conjunto de funções JSON em SQLite, precisamos expandir os dados JSON de amostra em comparação com os exemplos anteriores, para demonstrar o uso de cada função de uma maneira compreensível. Suponha que esta seja sua movie
tabela no banco de dados com um campo chamado data
, como mencionado no início desta seção:
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} |
A Função Agregada json_group_array()
Com Exemplo de Consulta SQL
A função json_group_array() é semelhante a qualquer outra função agregada em SQLite, agrupa múltiplas linhas de dados em uma única matriz JSON.
Por exemplo, esta consulta retornaria uma matriz JSON com todos os nomes dos filmes com uma Taxa maior que 6:
SELECT
json_group_array ( json_extract ( data, '$.Name' ) ) AS movie_names
FROM
movie
WHERE
json_extract ( data, '$.Rate' ) > 6
E o resultado seria algo assim:
movie_names |
---|
[“Forgotten in the Planet”, “The Obsessed’s Fairy”] |
A função json_group_object()
em JSON com exemplo de consulta SQL
A função json_group_object() cria um objeto JSON agrupando duas colunas de uma consulta, onde a primeira coluna é usada como chave e a segunda como valor. A primeira será usada como nome da chave dos campos JSON, e a segunda como seus valores.
Por exemplo, esta consulta retornará um objeto JSON onde o nome de cada campo é o ID de um filme e o valor do campo é o nome correspondente, se o filme
tiver uma Rate
maior que 6, o que excluiria o último filme:
SELECT
json_group_object ( json_extract ( Data, '$.ID' ), json_extract ( Data, '$.Name' ) ) AS movie_rates
FROM
movie
WHERE
json_extract ( Data, '$.Rate' ) > 5
O resultado seria algo como isto, um objeto JSON composto pelo ID e Nome dos primeiros dois filmes, pois eles têm uma Rate
maior que 5:
movie_rates |
---|
{“1”: “Forgotten in the Planet”,”2″:”The Obsessed’s Fairy”} |
Analisar dados JSON com json_each()
e json_tree()
Funções de Valor de Tabela em SQLite
O SQLite oferece duas poderosas funções de valor de tabela para trabalhar com seus dados JSON, json_each()
e json_tree()
. Elas têm variações com e sem o parâmetro de caminho, permitindo que você interaja com seus dados JSON em diferentes profundidades.
Suponha que este seja o único valor JSON inserido na coluna de dados da tabela de filmes no banco de dados SQLite, vamos começar a explicar as funções agregadas sobre ele:
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 } |
A Função json_each()
em SQLite com Exemplo de Consulta SQL
A função json_each() divide um objeto JSON em linhas, com cada linha representando um campo no objeto JSON, passando apenas pelo primeiro nível de campos JSON aninhados.
Por exemplo, esta consulta retornaria 8 linhas para cada campo no dado JSON:
SELECT
key,
value,
type
FROM
movie,
json_each ( data )
O resultado seria algo como isto, listando a chave e os valores de cada campo no JSON como uma linha, como você vê, o campo de array Genre
e Cast
são listados como estão, e a função não entrou neles para listar os itens do segundo nível:
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 |
A Função json_tree()
em SQLite com Exemplo de Consulta SQL
A função json_tree() é usada para percorrer e analisar dados JSON completamente, o que significa que entraria em cada campo por todos os níveis aninhados. A função json_tree()
percorre o JSON, examinando cada parte dele, e então fornece uma tabela que detalha cada elemento que encontrou.
A json_tree()
exibe os resultados como um conjunto de linhas, fornecendo uma visão clara mesmo das informações JSON mais complexas e aninhadas. Esta tabela indica o nome de cada elemento, o tipo de dados que é, seu valor e onde está localizado dentro da estrutura JSON.
Portanto, essa consulta retornaria várias linhas, descrevendo a estrutura do objeto JSON, incluindo o campo aninhado Cast:
SELECT
key,
value,
type
FROM
movie,
json_tree ( data )
O resultado da consulta acima seria algo assim:
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 |
Com o parâmetro de caminho, json_tree()
pode se concentrar em uma parte específica do JSON. Se você fornecer a json_tree()
um caminho específico no JSON como segundo argumento, ele começará sua exploração a partir daí.
Por exemplo, essa consulta ignora tudo fora do campo Cast, oferecendo uma visão focada deste array JSON aninhado:
SELECT
key,
value,
type
FROM
movie,
json_tree ( data, '$.Cast' )
O resultado da consulta acima seria algo assim:
key | Value | Type |
---|---|---|
0 | Adrian Gratianna | text |
1 | Tani O’Hara | text |
2 | Tessie Delisle | text |
Curiosidade: Você já percebeu o ‘1’ na URL da documentação oficial do JSON em SQLite e se perguntou se tem uma história? Quando o suporte ao JSON foi lançado pela primeira vez no SQLite em 2015, o criador esperava que ‘JSON1’ fosse apenas o começo de uma série de versões — JSON2, JSON3 e assim por diante. Mas aqui está a parte divertida: ‘JSON1’ foi tão eficaz e eficiente que nunca foi necessário criar um ‘JSON2’ ou ‘JSON3’. Então, o ‘1’ em ‘JSON1’ não é apenas um indicador de versão — é uma marca de sucesso!
3. Abordagens Práticas Para Consultar Qualquer Dado JSON Complexo no SQLite
Utilizando as funções JSON do SQLite em conjunto com as funções internas do SQLite, você pode executar consultas de dados mais complexas. Aqui estão alguns exemplos, incluindo agregação, filtragem e expressões de caminho.
Como mencionado no início do post, os dados JSON na tabela movie
nos exemplos para todas as seções restantes seriam assim:
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} |
Criando Consultas SQL Agregadas com Funções JSON no SQLite
Essa abordagem envolve o uso de funções JSON junto com funções de agregação internas do SQLite para realizar cálculos em dados JSON. Por exemplo, você pode calcular a média da Duração dos filmes categorizados como Comédia usando a seguinte consulta:
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';
O resultado da consulta acima seria algo assim, pois existem dois filmes no banco de dados com o gênero Comédia, e suas Duradas são 90 e 98, então a média deles seria assim:
average_runtime |
---|
94 |
Decodificação e Filtragem de Dados JSON com Múltiplas Condições
Você pode utilizar a função json_extract()
do SQLite para filtragem detalhada, usando-a na cláusula WHERE
de uma consulta SQL. Por exemplo, você pode filtrar filmes com base em condições específicas, como filmes que têm dois membros do elenco ou mais e uma Avaliação
superior a um determinado valor.
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;
O resultado da consulta acima seria algo assim:
movie_name | movie_rate | cast_size |
---|---|---|
The Obsessed’s Fairy | 9.5 | 2 |
Utilizando Expressões de Caminho para Extrair Valores Específicos de Dados JSON no SQLite
Expressões de caminho podem ser usadas para acessar dados JSON aninhados naquele endereço específico. Este exemplo retorna uma lista de todos os movie
directors
que dirigiram um filme em um determinado gênero, como História.
SELECT DISTINCT
json_extract ( data, '$.Director' ) AS movie_director
FROM
movie,
json_each ( json_extract ( data, '$.Genre' ) )
WHERE
value = 'History';
O resultado da consulta acima seria algo assim:
movie_director |
---|
Simone Mikey Bryn |
4. Como Verificar o Esquema dos Dados JSON no SQLite
Verificar o esquema dos dados JSON no SQLite é uma maneira de garantir a estrutura e a consistência dos seus dados, melhorar o tratamento de erros futuros e simplificar a manipulação de dados complexos. Embora o SQLite não possua funções internas para validação de esquema, você pode usar suas funções JSON e a CHECK para este propósito.
Verificando a Estrutura JSON com as Funções SQLite json_type()
e check()
A função json_type()
pode ser usada para verificar o tipo de um campo nos dados JSON. Por exemplo, baseando-se na criação anterior da tabela de filmes, suponha que ao criar a tabela para armazenar os dados JSON de um filme, você queira garantir que cada entrada tenha os campos Name e Year, sendo Year um inteiro. Para isso, você pode usar uma restrição CHECK() com a função json_type()
na criação da tabela:
CREATE TABLE movie ( data TEXT CHECK ( json_type ( data, '$.Name' ) IS NOT NULL AND json_type ( data, '$.Year' ) = 'integer' ) );
Aqui json_type()
verifica o tipo dos campos especificados em seus dados JSON, o nome e o ano. Se uma nova inserção ou operação de atualização tentar adicionar dados onde o nome não existe ou o ano não é um inteiro, a restrição CHECK() falhará e a operação será rejeitada. Isso ajuda a manter a integridade dos dados JSON na tabela de filmes.
Validando Dados JSON Usando a json_valid()
Função no SQLite
A função json_valid()
verifica a validade dos dados JSON do ponto de vista do formato padrão JSON, oferecendo um certo grau de validação de esquema. Por exemplo, para garantir a integridade dos dados JSON antes da inserção, você pode aplicar verificações de validação como esta:
INSERT INTO movie ( data ) SELECT
'{"Name":"Naked of Truth","Year":1979}' AS movie_input
WHERE
json_valid ( movie_input );
Nesta declaração, json_valid()
verifica se a string JSON fornecida é válida. Se for, os dados são inseridos na tabela de filmes e, se não for, a operação é ignorada. Essa proteção evita a inserção de dados JSON malformados.
Vamos considerar outro exemplo combinando as duas regras, a restrição na fase de criação da tabela de filmes e a verificação json_valid()
nas inserções. Considerando a seguinte consulta:
INSERT INTO movie ( data ) SELECT
'{"Year":"1979"}' AS movie_input
WHERE
json_valid ( movie_input );
O resultado desta consulta seria uma mensagem de erro “CHECK constraint failed” porque o valor de entrada não possui um campo de Nome e o campo de Ano não é um inteiro, portanto, a inserção falharia, mesmo que os dados JSON fornecidos sejam um JSON válido.
Além disso, para uma validação de esquema mais abrangente sobre dados JSON complexos e aninhados, você pode considerar a biblioteca JSONschema do Python também.
5. Como Gerenciar Dados JSON Aninhados no SQLite
Navegar por dados JSON aninhados e hierárquicos no SQLite pode apresentar alguns desafios. No entanto, as funções JSON integradas do SQLite simplificam este processo e o tornam viável. Aqui, você pode ver algumas estratégias para gerenciar JSON aninhado no SQLite.
Desdobrando Dados JSON Hierárquicos Usando Consultas SQL
As funções json_each()
e json_extract()
do SQLite podem ajudá-lo a navegar pelas camadas de dados JSON aninhados. Considere esta consulta que usa json_each()
para analisar os dados e json_extract()
para extrair seletivamente as informações necessárias.
Por exemplo, esta consulta vai explorar o array de Elenco em cada registro JSON no campo data
na tabela movie
, e listará os movies
que têm mais de 2 membros de 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;
O resultado da consulta acima seria algo como isto:
key | movie_name | movie_year | cast_size |
---|---|---|---|
Simone Mikey Bryn | Forgotten in the Planet | 1970 | 3 |
Navegação em Arrays JSON por meio de Consultas SQL
Objetos JSON podem conter informações importantes na forma de um array. Ao usar json_tree()
e json_extract()
em combinação, você pode iterar por esses arrays aninhados e extrair dados deles.
Por exemplo, essa consulta busca o nome de cada Ator
do array Cast de cada registro de filme:
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%' );
O resultado dessa consulta seria este:
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 |
Achatamento de Dados JSON Usando a Função json_each()
no SQLite
Às vezes, simplificar estruturas JSON aninhadas por meio do achatamento pode ser uma abordagem prática para resolver algumas consultas complexas contra objetos JSON. A função json_tree()
do SQLite pode ser usada para achatar objetos JSON.
Por exemplo, essa consulta usa json_tree()
para converter os dados JSON em uma tabela de pares chave-valor, completamente achatada, a consulta buscaria cada tipo de valor primário, passando por arrays e objetos também, do primeiro registro de filme:
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
O resultado dessa consulta seria este:
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 |
Ao adotar esses métodos, você pode analisar, gerenciar e decodificar dados JSON no SQLite de forma eficiente, o que é inestimável ao lidar com dados JSON complexos.
6. Como Usar Indexação para Otimização de Consultas Sobre Dados JSON no SQLite
Indexar dados JSON em SQLite é uma maneira eficaz de otimizar operações de pesquisa e melhorar o desempenho de consultas, especialmente para grandes conjuntos de dados. Ao criar um índice baseado em certas propriedades JSON, você pode acelerar significativamente as operações de pesquisa em uma coluna JSON.
O princípio por trás desse método é simples. Em vez de realizar uma varredura completa da tabela e analisar o JSON para cada linha, o que pode ser consumidor de recursos, o SQLite pode aproveitar o índice para localizar rapidamente as linhas de interesse.
Como Adicionar Indexação SQL em Dados JSON no SQLite
Vamos considerar um exemplo prático com o movie
dataset. Por exemplo, se você pesquisa frequentemente filmes por seu Name
, criar um índice nesta propriedade seria benéfico:
CREATE INDEX idx_name ON movie ( json_extract ( data, '$.item.Name' ) );
Aqui, o data
é a coluna com os dados JSON, e o movie
é a tabela. A função json_extract()
extrai o Name
de cada movie
de seus dados JSON, e o SQLite usa esse valor para criar um índice.
Uma vez que você execute esta consulta e o índice é estabelecido, o SQLite pode recuperar rapidamente dados quando você consultar um filme pelo seu Nome
. Essa consulta seria muito mais rápida com o índice idx_name em vigor. Portanto, adicionar indexação a dados JSON no SQLite oferece capacidades de otimização poderosas, tornando-o uma maneira eficiente de gerenciar grandes conjuntos de dados JSON.
Como Criar Um Índice em Várias Colunas de Dados JSON no SQLite
Vamos considerar outro exemplo em que você possa consultar dados específicos com mais frequência com base em mais de uma coluna. Por exemplo, se você pesquisar com frequência filmes
por Nome e Ano, seria benéfico criar um índice nesses atributos juntos. No SQLite, isso poderia ser feito criando um índice em uma expressão calculada:
CREATE INDEX idx_name_year ON movie ( json_extract ( data, '$.Item.Name' ), json_extract ( data, '$.Item.Year' ) );
Mais uma vez, quando este índice é estabelecido, o SQLite pode recuperar rapidamente dados quando você consultar um filme por Nome e Ano.
7. Suporte a Json5 no SQLite
O JSON5 foi introduzido para suportar algumas sintaxes compatíveis com ECMA e tornar o JSON um pouco mais adequado para ser usado como uma linguagem de configuração. O SQLite introduziu o suporte ao extensão JSON5 em versão 3.42.0. Embora o SQLite possa ler e interpretar o texto JSON que inclui extensões JSON5, qualquer texto JSON que as funções do SQLite geram se encaixará estritamente na definição de JSON canônico. Aqui estão algumas das principais características que a extensão JSON5 adiciona ao suporte ao JSON no SQLite.
Objetos JSON com Comentários no SQLite JSON
O JSON5 permite comentários de uma linha (//…) e multilinha (/…/). Isso pode ser particularmente útil para adicionar contexto ou explicações diretamente dentro de seus dados JSON. Aqui está um exemplo de comentários em objetos JSON:
/* A
multi-line
comment
in JSON5 */
{
"key": "value" // A single-line comment in JSON5
}
Chaves de Objeto sem Aspas no SQLite JSON
No JSON5, as chaves de objeto podem ser identificadores não citados, simplificando sua sintaxe JSON. No entanto, é importante notar que isso pode limitar a compatibilidade com sistemas que seguem rigorosamente os padrões JSON.
{ key: "value" }
Cadeias de Caracteres Multilinha em Objetos JSON
O JSON5 suporta cadeias de caracteres multilinha, que podem ser alcançadas escapando caracteres de nova linha. Isso é útil ao lidar com grandes cadeias de caracteres ou ao formatar a cadeia de caracteres em um formato mais legível.
{ key: "This is a \\\\\\\\ multiline string" }
Validação de Json5 vs. JSON Canônico no SQLite
Aqui, vamos abordar as técnicas de validação completas para objetos JSON5 e JSON canônico, explicando seu suporte por exemplos de consultas SQL precisos no banco de dados SQLite.
Para determinar se uma string é um JSON5 válido, você pode usar a função json_error_position()
. Essa função retornará um valor não zero se a string não for bem formada em JSON ou JSON5. Veja um exemplo:
SELECT
json_error_position ( '{ key: "value"}' ) AS error_position;
O resultado desta consulta seria 0, indicando que nenhum erro é detectado aqui, mesmo que a chave esteja sem aspas, pois esta é uma extensão válida do JSON5.
error_position |
---|
0 |
Por outro lado, para converter uma string JSON5 em JSON canônico, você pode usar a função json()
. Embora essa função reconheça e processe entrada JSON5, ela produzirá apenas JSON canônico. Isso permite compatibilidade reversa com sistemas que esperam JSON canônico. Veja um exemplo:
SELECT
JSON ( '{key: "value"}' ) AS canonical_json;
O resultado desta consulta seria um JSON canônico, convertido do formato JSON5, o que fez com que a chave fosse citada aqui:
canonical_json |
---|
{“key”: “value”} |
No entanto, esteja ciente de que a função json_valid()
continuará a relatar falso para entradas que não são JSON canônico, mesmo se a entrada for um JSON5 válido. Esta é uma distinção importante ao trabalhar com ambos, JSON canônico e JSON5 no SQLite. Por exemplo, considere a seguinte consulta:
SELECT
json_valid ( '{key: "value"}' ) AS valid_json;
O resultado desta consulta seria 0, indicando que este não é um JSON válido, pois possui uma chave sem aspas, o que é uma violação do formato JSON canônico:
valid_json |
---|
{“key”: “value”} |
8. Erros Comuns e Solução de Problemas ao Trabalhar com JSON no SQLite
Manipulação de dados JSON no SQLite envolve alguns problemas comuns que podem ser evitados com uma compreensão mais profunda dos mecanismos específicos, como o uso correto de funções. Aqui estão algumas considerações-chave.
Como Depurar Erros de Sintaxe em Dados JSON na Fase de Análise de JSON do SQLite
Os dados JSON devem ser formatados corretamente e seguir uma sintaxe padrão específica para serem analisados e processados no banco de dados SQLite. Se sua string JSON estiver mal formatada, o SQLite não conseguirá interpretá-la, resultando em erros. Por exemplo, você pode ter parênteses desiguais, uso incorreto de aspas ou vírgulas deslocadas.
O SQLite fornece a função json_valid()
para validar a string JSON, como o nome sugere. A função json_valid()
retorna um se a entrada for uma string JSON bem formada e 0 caso contrário. Aqui está um exemplo:
SELECT json_valid('{"Name":"Naked of Truth","Year":1979}');
No caso de um erro de sintaxe na string JSON, a função json_error_position()
pode ser usada para identificar a posição na string onde ocorreu o erro:
SELECT json_error_position('{"Name":"Naked of Truth","Year":1979}');
Uso Incorreto de Funções JSON ao Consultar Dados JSON
O uso incorreto de funções JSON é outro problema comum, portanto, é crucial ter uma compreensão sólida das funções JSON e de seu uso no SQLite para um manejo de dados bem-sucedido. Por exemplo, usar o caminho errado ou não levar em conta o sistema de índice baseado em zero dos arrays JSON no SQLite pode levar a erros ou recuperação de dados incorreta.
Não há suporte a BLOBs nas funções JSON do SQLite
É importante garantir que você não esteja tentando usar BLOBs com funções JSON no SQLite, pois todas as funções JSON atualmente lançam um erro se algum de seus argumentos for um BLOB e não uma entrada JSON válida. O SQLite atualmente não suporta nenhum tipo de codificação binária de JSON, embora isso possa ser uma melhoria futura.
Como Fazer Validação JSON Durante Consulta SQL de Dados JSON no SQLite
A função json()
no SQLite é usada principalmente para impor a formatação JSON de uma string adicionando aspas, escapando caracteres necessários, etc. O uso incorreto da função json()
pode resultar em falta de captura de erros e possíveis inconsistências de dados.
No entanto, ela não é projetada para validar um JSON. Para validar uma string JSON ou encontrar um erro de sintaxe, use as funções json_valid()
e json_error_position()
conforme discutido anteriormente.
Conclusão
Neste guia abrangente, percorremos a integração poderosa de JSON e SQLite, oferecendo insights sobre as vastas oportunidades que essa combinação proporciona. Começamos com uma visão geral das funções JSON do SQLite, juntamente com seus casos de uso detalhados e exemplos de consultas SQL.
Nós exploramos técnicas avançadas de consulta, como lidar com dados JSON hierárquicos dentro do SQLite. A jornada aprofundou-se nas mecânicas de decodificação e gerenciamento de dados JSON, destacando a utilidade das funções do SQLite como json_each()
e json_tree()
. Também abordamos o valor de achatamento de dados JSON para um manejo de dados eficiente.
Em seguida, nos aprofundamos em uma área significativa que muitas vezes é negligenciada: o aumento de desempenho por meio de indexação. Essa poderosa otimização pode acelerar muito o desempenho das consultas e melhorar sua experiência com o SQLite e JSON. Discutimos então a extensão moderna JSON5, trazendo mais flexibilidade à formatação de seus dados JSON.
Por fim, abordamos alguns erros comuns e dicas de solução de problemas para suavizar sua jornada pelo JSON no SQLite, enfatizando a importância da sintaxe correta do JSON e do uso adequado das funções JSON do SQLite.
Lembre-se, aprender e experimentar são as chaves para desbloquear todo o potencial do JSON no SQLite. À medida que você aplica essas técnicas em seus projetos, compartilhe suas experiências para ajudar outras pessoas em uma jornada semelhante. Então, vamos continuar aprendendo e empurrando fronteiras com JSON no SQLite. Tenha um bom uso do JSON!
Source:
https://dzone.com/articles/how-to-master-advanced-json-querying-in-sqlite