web-dev-qa-db-fra.com

postgresql migration JSON vers JSONB

Dans postgresql 9.4, le nouveau JSONB a été incorporé.

Sur une base de données en direct dans postgresql 9.3, j'ai une colonne JSON.

Je veux le migrer vers JSONB.

En supposant que j'ai d'abord migré la base de données vers 9.4 (en utilisant pg_upgrade). Que dois-je faire ensuite?

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

Dans le cadre de Rails, voici une alternative de migration 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

Je ne sais pas comment cela se compare à la réponse acceptée en termes de performances, mais je l'ai testée sur une table avec 120 000 enregistrements, chaque enregistrement ayant quatre colonnes json et il m'a fallu environ une minute pour migrer cette table . Bien sûr, je suppose que cela dépend de la complexité de la structure json.

Notez également que si vos enregistrements existants ont une valeur par défaut de {}, vous devez ajouter aux déclarations ci-dessus default: {}, car sinon vous aurez jsonb colonnes, mais la valeur par défaut restera comme '{}'::json.

30
Alex Popov