57

在 postgresql 9.4 中,合并了新的 JSONB。

在 postgresql 9.3 的实时数据库上,我有一个 JSON 列。

我想将它迁移到 JSONB。

假设我首先将数据库迁移到 9.4(使用 pg_upgrade)。接下来我该怎么做?

4

2 回答 2

98
ALTER TABLE table_with_json
  ALTER COLUMN my_json
  SET DATA TYPE jsonb
  USING my_json::jsonb;
于 2015-01-28T21:10:33.840 回答
37

在 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 条记录的表上进行了测试,每条记录有四json列,我花了大约一分钟来迁移该表。当然,我想这取决于json结构的复杂程度。

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

于 2016-04-07T06:54:02.053 回答