Postgresql 9.4では、新しいJSONBが組み込まれました。
Postgresql 9.3のライブDBにJSON列があります。
JSONBに移行したい。
最初にDBを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
これが受け入れられた回答のパフォーマンスと比較してどうなるかはわかりませんが、各レコードが4つのjson
列を持つ120 000レコードのテーブルでこれをテストし、そのテーブルを移行するのに約1分かかりました。もちろん、json
構造がどれほど複雑であるかによると思います。
また、既存のレコードのデフォルト値が{}
である場合は、上記のステートメントdefault: {}
に追加する必要があります。そうしないと、jsonb
列がありますが、デフォルト値'{}'::json
のままになります。