[Quick Tip] Atualizando colunas JSONB no Postgres

[Quick Tip] Atualizando colunas JSONB no Postgres

Olá pessoALL,

Há uns 2 anos iniciei em um projeto que usava o RethinkDb mas depois de um tempo decidimos migrar para o Postgresql por podermos combinar o melhor dos 2 mundos: Relacional e Não Relacional.

Nosso Orm de escolha foi o Marten e por mais que ele ajude BASTANTE no dia a dia, existem algumas tarefas que precisamos fazer direto no banco, como alguns updates, correções e migrações.

Dica: Vale muito a pena conhecer um pouco mais o Marten, especialmente, pois existe um port para sql server sendo feito.

As vezes por pressa, ou comodidade mesmo, acabamos escrevendo alguma console app que carrega os dados, faz as manipulações que precisamos e atualizamos os registros, mas nem sempre isso é viavel.

Um comando que me ajuda muito é o jsonb_set:

Returns target with the section designated by path replaced by new_value, or with new_value added if create_missing is true ( default is true) and the item designated by path does not exist. As with the path orientated operators, negative integers that appear in path count from the end of JSON arrays.

A assinatura da função: jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])

Exemplos

1 - Novo Campo

UPDATE users
SET data = jsonb_set(data, '{Idade}', '"30"', TRUE)
WHERE id = 1    -- rsantosdev

2 - Novo Array

UPDATE users
SET data = jsonb_set(data, '{Telefones}', '["123456", "999888777", "222333555"]', TRUE)
WHERE id = 1;

3 - Novo campo em um object filho

UPDATE users
SET data = jsonb_set(data, '{Endereco,Rua}', '"Majakovski 2"', TRUE)
WHERE id = 1;

4 - Atualizando registros com outra coluna jsonb

UPDATE ranking
SET data = jsonb_set(ranking.data, '{UserName}', COALESCE(usr.data->'Name', '""'), TRUE)
FROM user usr
WHERE usr.id = user_id

Por hoje é só pessoALL,
Espero ter ajudado!