postgresql 迁移 JSON 到 JSONB
postgresql migrating JSON to JSONB
在 postgresql 9.4 中加入了新的 JSONB。
在 postgresql 9.3 的实时数据库中,我有一个 JSON 列。
我想将其迁移到 JSONB。
假设我先将数据库迁移到 9.4(使用 pg_upgrade)。接下来我该做什么?
ALTER TABLE table_with_json
ALTER COLUMN my_json
SET DATA TYPE jsonb
USING my_json::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
我不知道这与公认的答案在性能方面相比如何,但我在一个 table 上测试了这个,有 120 000 条记录,每条记录有四个 json
列,它花了我大约需要一分钟时间来迁移 table。当然,我猜这取决于 json
结构的复杂程度。
此外,请注意,如果您现有的记录具有默认值 {}
,您必须添加上述语句 default: {}
,否则您将拥有 jsonb
列, 但默认值将保持为 '{}'::json
.
在 postgresql 9.4 中加入了新的 JSONB。
在 postgresql 9.3 的实时数据库中,我有一个 JSON 列。
我想将其迁移到 JSONB。
假设我先将数据库迁移到 9.4(使用 pg_upgrade)。接下来我该做什么?
ALTER TABLE table_with_json
ALTER COLUMN my_json
SET DATA TYPE jsonb
USING my_json::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
我不知道这与公认的答案在性能方面相比如何,但我在一个 table 上测试了这个,有 120 000 条记录,每条记录有四个 json
列,它花了我大约需要一分钟时间来迁移 table。当然,我猜这取决于 json
结构的复杂程度。
此外,请注意,如果您现有的记录具有默认值 {}
,您必须添加上述语句 default: {}
,否则您将拥有 jsonb
列, 但默认值将保持为 '{}'::json
.