web-dev-qa-db-ja.com

PostgreSQL JSON列をJSONBにアップグレードしますか?

PostgreSQL 9.4にアップグレードした後、すべてのJSON列をJSONB列に変換するにはどうすればよいですか?

重複するキーと空白を失ってもかまいません。

34
srlm
ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::jsonb;
52
Tometzky

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のままです。

5
Alex Popov