PostgreSQL JSONB - обновить имя ключа во всех строках одним запросом - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть поле jsonb в таблице PostgreSQL, и я хочу изменить только имя ключа, сохранив для него то же значение.

В настоящее время я делаю это в Rails следующим образом:

Event.each do |event|
   event.metadata['new_key'] = metadata['old_key']
   event.metadata.delete('old_key')
   event.save
end

Есть ли способ достичь того же результата с помощью одного запроса update_all?

1 Ответ

2 голосов
/ 17 апреля 2019

Предполагая ключ верхнего уровня и текущий PostgreSQL,
вы можете добиться этого, удалив старый ключ и добавив новый - со значением, скопированным из старого:

UPDATE event
SET    metadata = (metadata - 'old_key')
               || jsonb_build_object('new_key', metadata->'old_key')
WHERE  metadata ? 'old_key';  -- only where the key exists

дБ <> скрипка здесь

...