PostgreSQL 9.4にアップグレードした後、すべてのJSON列をJSONB列に変換するにはどうすればよいですか?
重複するキーと空白を失ってもかまいません。
ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::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レコードのテーブルでこれをテストしました。各レコードには4つのjson
列があり、そのテーブルを移行するのに約1分かかりました。もちろん、それはjson
構造の複雑さによって異なります。
また、既存のレコードのデフォルト値が{}
の場合は、上記のステートメントにdefault: {}
を追加する必要があります。そうしないと、jsonb
列が含まれますが、デフォルトの値は'{}'::json
のままです。