web-dev-qa-db-de.com

postgresql migriert JSON nach JSONB

In postgresql 9.4 wurde das neue JSONB integriert.

In einer Live-Datenbank in postgresql 9.3 habe ich eine JSON-Spalte.

Ich möchte es nach JSONB migrieren.

Angenommen, ich habe die Datenbank zuerst auf 9.4 migriert (mit pg_upgrade). Was tue ich als nächstes?

46
Boaz
ALTER TABLE table_with_json
  ALTER COLUMN my_json
  SET DATA TYPE jsonb
  USING my_json::jsonb;
78
Marth

Im Kontext von Rails gibt es hier eine ActiveRecord-Migrationsalternative:

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

Ich weiß nicht, wie sich dies im Vergleich zur akzeptierten Antwort in Bezug auf die Leistung verhält, aber ich habe dies an einer Tabelle mit 120 000 Datensätzen getestet, wobei jeder Datensatz vier json Spalten aufweist, und es hat ungefähr eine Minute gedauert, diese Tabelle zu migrieren . Natürlich kommt es darauf an, wie komplex die json -Struktur ist.

Beachten Sie auch, dass Sie, wenn Ihre vorhandenen Datensätze einen Standardwert von {} Haben, die obigen Anweisungen default: {} Hinzufügen müssen, da Sie andernfalls jsonb Spalten haben, aber Der Standardwert bleibt '{}'::json.

30
Alex Popov