42

After upgrading to PostgreSQL 9.4, how do I convert all my JSON columns into JSONB columns?

I don't mind losing any duplicate keys and whitespace.

srlm
  • 3,186
  • 2
  • 27
  • 40

2 Answers2

65
ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::jsonb;
halfr
  • 36
  • 7
Tometzky
  • 22,573
  • 5
  • 59
  • 73
7

In the context of Rails, here is an ActiveRecord migration alternative:

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

I tested this on a table with 120 000 records, each record having four json columns and it took me about a minute to migrate that table. Of course, it depends on how complex the json structure is.

Also, notice that if your existing records have a default value of {}, you have to add to the above statements default: {}, because otherwise you'll have jsonb columns, but the default value will remain as '{}'::json.

Alexander Popov
  • 23,073
  • 19
  • 91
  • 130