将PostgreSQL JSON列升级到JSONB?

srl*_*rlm 33 postgresql jsonb

升级到PostgreSQL 9.4之后,如何将所有JSON列转换为JSONB列?

我不介意丢失任何重复的密钥和空白.

Tom*_*zky 51

ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::jsonb;
Run Code Online (Sandbox Code Playgroud)


Ale*_*pov 5

在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
Run Code Online (Sandbox Code Playgroud)

我在具有12万条记录的表上进行了测试,每条记录有四json列,迁移该表花了我大约一分钟的时间。当然,这取决于json结构的复杂程度。

另外,请注意,如果您现有的记录的默认值为{},则必须添加到上述语句中default: {},因为否则您将拥有jsonb列,但默认值将保持为'{}'::json