【问题标题】:postgresql migrating JSON to JSONB [duplicate]postgresql将JSON迁移到JSONB [重复]
【发布时间】:2015-03-27 22:30:14
【问题描述】:

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

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

我想将它迁移到 JSONB。

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

【问题讨论】:

    标签: postgresql ddl jsonb


    【解决方案1】:
    ALTER TABLE table_with_json
      ALTER COLUMN my_json
      SET DATA TYPE jsonb
      USING my_json::jsonb;
    

    【讨论】:

    • 有没有关于这有多快的基准?理想情况下,随着记录数量的增加。
    • 问这个是a separate question
    • 在 Rails 控制台中:ActiveRecord::Base.connection.execute('ALTER TABLE table_with_json ALTER COLUMN my_json SET DATA TYPE jsonb USING my_json::jsonb')
    • 这在 postgresql 9.5 中迁移时不起作用
    • 如果有人使用旧的 sqlalchemy-utils 并且想知道 JSONB 不是 sqlalchemy-util 数据类型,您可以在模型中使用 from sqlalchemy.dialects.postgresql import JSONB。并按照上述答案迁移数据库
    【解决方案2】:

    在 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 ... enddef down ... end
    • @OzBarry 因为约定和因为使用 change 结合 reversible 是“推荐”的方式。看看edgeguides.rubyonrails.org/…,特别是 3.8 使用 change 方法,3.9 使用可逆,3.10 使用 up/down 方法
    • 您能在此处添加此答案吗? stackoverflow.com/questions/50024841/… 。这样,这将是正确的答案,因为这个问题实际上并没有提到 rails
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2016-10-25
    • 2021-10-19
    • 1970-01-01
    • 2016-08-05
    相关资源
    最近更新 更多