CodeGym /Cursos /SQL SELF /Atualizando dados em objetos JSON com jsonb_set()<...

Atualizando dados em objetos JSON com jsonb_set() e jsonb_insert()

SQL SELF
Nível 33, Lição 4
Disponível

Então, JSONB no PostgreSQL é uma ferramenta poderosa pra guardar estruturas de dados complexas e hierárquicas. Mas e se tu precisar atualizar um valor dentro de uma coluna JSONB? Tipo, trocar o número de telefone de um usuário ou adicionar uma nova categoria num array? Parece simples, mas JSONB não é uma tabela onde tu pode só mudar o valor de uma célula direto. Pra atualizar dados num objeto JSON, a gente vai usar funções especiais. Hoje os protagonistas são:

  • jsonb_set(): pra mudar ou adicionar um valor num "caminho" específico.
  • jsonb_insert(): pra inserir um novo elemento num array JSON.

Atualizando dados com jsonb_set()

A função jsonb_set() permite alterar parte de um objeto JSONB ou adicionar novas chaves e valores nele.

Sintaxe geral

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — nosso objeto JSONB que a gente quer atualizar.
  • path — array de strings representando o caminho até a chave que tu quer mudar.
  • new_value — o valor que a gente quer adicionar ou trocar.
  • create_missing — parâmetro booleano (TRUE ou FALSE) que diz se deve criar as chaves que não existem ainda.

Bora ver um exemplo simples. Imagina que a gente tem uma tabela users com uma coluna profile do tipo JSONB, onde ficam os perfis dos usuários. Um dos usuários vai atualizar o número de telefone. Como a gente faz isso?

-- Criando a tabela e adicionando dados
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

INSERT INTO users (profile)
VALUES ('{"name": "Otto", "contact": {"phone": "+1-495-123-45-67"}}');

-- Atualizando o número de telefone
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- Conferindo o resultado
SELECT profile FROM users WHERE id = 1;

Resultado:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

Uau! Mudamos o número de telefone! Repara que o caminho pra chave é passado como um array de strings '{contact,phone}'.

Adicionando uma nova chave

Se a chave que tu quer atualizar não existe, tu pode usar o parâmetro create_missing = TRUE pra criar ela:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlim"', TRUE)
WHERE id = 1;

-- Conferindo o resultado
SELECT profile FROM users WHERE id = 1;

Resultado:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlim"
  }
}

Agora temos uma nova seção de endereço. Prático, né?

Inserindo dados com jsonb_insert()

A função jsonb_insert() serve pra adicionar elementos em arrays dentro de objetos JSONB.

Sintaxe geral

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — o objeto JSONB alvo.
  • path — array de strings representando o caminho até o array onde tu quer inserir elementos.
  • new_value — o valor que tu quer adicionar.
  • insert_after — parâmetro booleano. Se for FALSE, o elemento é inserido antes do índice indicado; se for TRUE, depois.

Vamos ver um exemplo. Supondo que temos uma tabela onde a coluna profile guarda a lista de interesses do usuário. Queremos adicionar um novo interesse no array:

-- Adicionando dados pro exemplo
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["esporte", "música"]', TRUE)
WHERE id = 1;

-- Inserindo o novo interesse "programação" no início da lista
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"programação"', FALSE)
WHERE id = 1;

-- Conferindo o resultado
SELECT profile FROM users WHERE id = 1;

Resultado:

{
  "name": "Otto",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Berlim"
  },
  "interests": [
    "programação",
    "esporte",
    "música"
  ]
}

Problemas comuns e como evitar

Trabalhar com jsonb_set() e jsonb_insert() pode ser meio pegadinha se tu não prestar atenção nesses pontos:

  1. Caminho errado pra chave. Se tu passar o caminho errado ou tentar atualizar um elemento que não existe sem create_missing=TRUE, vai dar erro ou não vai mudar nada. Sempre confere a estrutura do teu JSON.
  2. Tipo de dado errado. Lembra que new_value tem que ser do tipo JSONB. Se tu quiser inserir uma string, coloca ela entre aspas duplas ('"valor"').
  3. Sobrescrever dados. Se tu tentar atualizar um array sem usar as funções certas, pode acabar apagando dados antigos sem querer. Usa jsonb_insert() pra adicionar elementos de boa.

Exemplo de erro:

-- Erro: caminho errado
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"novo contato"', FALSE)
WHERE id = 1;

Isso vai dar erro porque no objeto profile não tem a chave contacts, e create_missing tá como FALSE.

Como evitar:

-- Usando create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"novo contato"', TRUE)
WHERE id = 1;

Onde isso é usado na vida real?

Mexer com JSONB não é só diversão, é uma skill essencial pra vários apps modernos. Olha só alguns exemplos reais:

  • Guardar configurações de usuário. JSONB é perfeito pra estruturas de dados dinâmicas, tipo configs de apps que mudam de um usuário pra outro.
  • Integração com APIs externas. JSONB é ótimo pra guardar dados crus vindos de REST APIs que retornam objetos JSON.
  • Análise de dados grandes. Estruturas aninhadas em JSON ajudam a trabalhar com dados de IoT, logs ou analytics.

É isso aí, nosso tour introdutório sobre atualização de objetos JSON acabou. Agora tu já sabe inserir, atualizar e adicionar dados em JSONB, além de evitar os erros mais comuns. Na próxima aula tu vai aprender como juntar objetos JSONB e trabalhar com eles de um jeito ainda mais massa!

2
Tarefa
SQL SELF, nível 33, lição 4
Bloqueado
Atualizando um objeto JSON usando `jsonb_set()`
Atualizando um objeto JSON usando `jsonb_set()`
1
Pesquisa/teste
Trabalhando com dados JSON, nível 33, lição 4
Indisponível
Trabalhando com dados JSON
Trabalhando com dados JSON
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION