web-dev-qa-db-ja.com

JSONをJSONBに移行するpostgresql

Postgresql 9.4では、新しいJSONBが組み込まれました。

Postgresql 9.3のライブDBにJSON列があります。

JSONBに移行したい。

最初にDBを9.4に移行したと仮定します(pg_upgradeを使用)。次に何をしますか?

46
Boaz
ALTER TABLE table_with_json
  ALTER COLUMN my_json
  SET DATA TYPE jsonb
  USING my_json::jsonb;
78
Marth

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のままになります。

30
Alex Popov