【发布时间】:2015-03-27 22:30:14
【问题描述】:
在 postgresql 9.4 中,新的 JSONB 被合并。
在 postgresql 9.3 的实时数据库中,我有一个 JSON 列。
我想将它迁移到 JSONB。
假设我首先将数据库迁移到 9.4(使用 pg_upgrade)。接下来我该怎么做?
【问题讨论】:
标签: postgresql ddl jsonb
在 postgresql 9.4 中,新的 JSONB 被合并。
在 postgresql 9.3 的实时数据库中,我有一个 JSON 列。
我想将它迁移到 JSONB。
假设我首先将数据库迁移到 9.4(使用 pg_upgrade)。接下来我该怎么做?
【问题讨论】:
标签: postgresql ddl jsonb
ALTER TABLE table_with_json
ALTER COLUMN my_json
SET DATA TYPE jsonb
USING my_json::jsonb;
【讨论】:
ActiveRecord::Base.connection.execute('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
我不知道这与公认答案的性能相比如何,但我在一个有 120 000 条记录的表上进行了测试,每条记录有四个 json 列,我花了大约一分钟来迁移该表.当然,我想这取决于json 结构的复杂程度。
另外,请注意,如果您现有的记录具有默认值{},则必须在上述语句中添加default: {},否则您将拥有jsonb 列,但默认值将保持为'{}'::json.
【讨论】:
reversible do ... end 而不是def up ... end 和def down ... end?
change 结合 reversible 是“推荐”的方式。看看edgeguides.rubyonrails.org/…,特别是 3.8 使用 change 方法,3.9 使用可逆,3.10 使用 up/down 方法