将 PostgreSQL JSON 列升级到 JSONB?
Upgrade PostgreSQL JSON column to JSONB?
升级到 PostgreSQL 9.4 后,如何将所有 JSON 列转换为 JSONB 列?
我不介意丢失任何重复的键和空格。
ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::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
我在有 120 000 条记录的 table 上测试了这个,每条记录有四个 json
列,我花了大约一分钟的时间来迁移那个 table。当然,这取决于 json
结构的复杂程度。
此外,请注意,如果您现有的记录具有默认值 {}
,您必须添加上述语句 default: {}
,否则您将拥有 jsonb
列, 但默认值将保持为 '{}'::json
.
升级到 PostgreSQL 9.4 后,如何将所有 JSON 列转换为 JSONB 列?
我不介意丢失任何重复的键和空格。
ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::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
我在有 120 000 条记录的 table 上测试了这个,每条记录有四个 json
列,我花了大约一分钟的时间来迁移那个 table。当然,这取决于 json
结构的复杂程度。
此外,请注意,如果您现有的记录具有默认值 {}
,您必须添加上述语句 default: {}
,否则您将拥有 jsonb
列, 但默认值将保持为 '{}'::json
.