Rails de Migration de modification de la colonne à utiliser Postgres tableaux
Je suis en train de modifier une colonne dans ma base de données afin qu'il puisse utiliser la Postgres type de données de tableau.
Actuellement, la colonne de la table est de type string.
Je suis l'aide de la suite de la migration pour convertir:
def change
change_column :table, :dummy_column, :text, array: true, default: []
end
Mais j'obtiens l'erreur suivante:
bundle exec rake db:migrate
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::Error: ERROR: column "dummy_column" cannot be cast automatically to type character varying[]
HINT: Specify a USING expression to perform the conversion.
: ALTER TABLE "table" ALTER COLUMN "dummy_column" TYPE character varying(255)
Tasks: TOP => db:migrate
- vous pouvez utiliser change_column :table :dummy_column, :string, array: true, valeur par défaut: [] au lieu de texte, il peut résoudre votre problème
Vous devez vous connecter pour publier un commentaire.
PostgreSQL ne sais pas comment faire pour convertir automatiquement une colonne de
varchar
dans un tableau devarchar
. Il ne sait pas ce que vous pourriez l'intention, parce qu'il n'a aucun moyen de savoir quel format que vous pensez que les valeurs actuelles sont en.Si vous avez besoin de le dire; c'est ce que l'
USING
clause est pour.ActiveRecord ne semble pas explicitement le
USING
de l'alinéa (pas surprenant, car elle peine encore la prise en charge la plus élémentaire des fonctionnalités de base de données). Vous pouvez spécifier votre propre texte SQL pour la migration, si.En supposant que vos chaînes sont séparées par des virgules et ne peuvent eux-mêmes contenir des virgules, par exemple:
(Je n'utilise pas de Rails de moi-même et je n'ai pas testé, mais c'est cohérent avec la syntaxe utilisée dans les exemples d'ailleurs).
À l'aide de Rails 4.2 sur postgresql 9.4 j'ai été à la recherche pour ce faire et préserver ma pré-existante de la chaîne de données comme le premier élément est un élément de tableaux.
Il s'avère que postgresql ne peut forcer une chaîne de caractères dans un texte en tableau sans l'AIDE de l'expression pour le dire combien de.
Après beaucoup de jongler avec la délicate postgres syntaxe, j'ai trouvé un bon moyen moyen avec active record:
Le seul direct postgresql, il est le
(string_to_array() )
appel de fonction. Voici les docs sur que--notez que vous devez fournir un délimiteur.À l'aide de Rails 4.2 sur postgresql 9.4 avec un en bas et un en haut, base sur lrrthomas réponse.
Remarque: votre colonne doit avoir un défaut de néant
Avis:
il est spécifié comme type de données :chaîne de caractères avec le tableau: true par défaut de la colonne à un tableau vide ( [] ), vous utilisez par défaut: '{}'