Я бы написал миграцию следующим образом:
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
.