Ответ 1
ALTER TABLE table_with_json
ALTER COLUMN my_json
SET DATA TYPE jsonb
USING my_json::jsonb;
В postgresql 9.4 был включен новый JSONB.
В live DB в postgresql 9.3 У меня есть столбец JSON.
Я хочу перенести его в JSONB.
Предполагая, что я перенесли БД сначала до 9.4 (используя pg_upgrade). Что мне делать дальше?
ALTER TABLE table_with_json
ALTER COLUMN my_json
SET DATA TYPE jsonb
USING my_json::jsonb;
В контексте Rails здесь используется альтернатива миграции ActiveRecord:
def change
reversible do |dir|
dir.up { change_column :models, :attribute, 'jsonb USING CAST(attribute AS jsonb)' }
dir.down { change_column :models, :attribute, 'json USING CAST(attribute AS json)' }
end
end
Я не знаю, как это сравнивается с принятым ответом на производительность, но я проверил это на таблице с 120 000 записей, каждая запись имела четыре столбца json
, и мне потребовалось около минуты, чтобы перенести эту таблицу, Конечно, я думаю, это зависит от того, насколько сложна структура json
.
Также обратите внимание, что если ваши существующие записи имеют значение по умолчанию {}
, вы должны добавить к вышеуказанным операторам default: {}
, потому что в противном случае у вас будут столбцы jsonb
, но значение по умолчанию останется таким же '{}'::json
.