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:
- 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. - Tipo de dado errado. Lembra que
new_valuetem que ser do tipo JSONB. Se tu quiser inserir uma string, coloca ela entre aspas duplas ('"valor"'). - 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!
GO TO FULL VERSION