Rails 4 migration: comment réorganiser les colonnes
J'ai appris que add_column
a un :after
option pour définir l'emplacement de la colonne est insérée. Dommage que j'ai appris à ce sujet :après l'ajout d'un tas.
Comment puis-je écrire une migration simplement réorganiser les colonnes?
- Vous pourriez vous débarrasser de la Base de données pour enregistrer les Données ; re-commander votre Schéma.rb pour mettre les horodatages des colonnes à la fin de la create_table du bloc ; exécuter
rake db:drop db:create db:migrate
et puis re-importer vos Données - Maintenant, c'est une fonctionnalité non documentée : Vous avez à lire la base de sources pour le trouver. Juste pour la référence, je l'ai vérifié rename_column code : il n'offre pas cette fonctionnalité (désolé, ça n'aide pas).
- Utiliser SQL de migration. stackoverflow.com/questions/4095481/...
- Ce n'est pas une mauvaise idée. Pourriez-vous vous présenter comme une réponse, de préférence avec un peu de code pour afficher la syntaxe pour l'exécution de raw MySQL dans une migration.
- Je viens de remarquer une autre réponse, mais Stefan montre une belle façon de le faire sans SQL..
- Cela n'a pas fonctionné pour moi. Le
rake
commandes de réorganiser les colonnes, c'est correct. Mais quand je me suis ré-importer mes données existantes à l'aide d'un dump SQL de l'ordre de tri des colonnes se foiré à nouveau. - Bon point, sauf que vous ne devez pas modifier le
schema.rb
directement. Créer une migration à la place. Je cite ici les rails de la documentation surschema.rb
[rails 5.1]: "Ce fichier est généré automatiquement à partir de l'état actuel de la base de données. Au lieu de modifier ce fichier, veuillez utiliser les migrations fonction d'Active Record". Donc: 1/ effacer pertinentes migrations 2/ runrake db:drop db:create
(elle va vider laschema.rb
), 3/ créer une migration, 4/ le modifier pour ajouter les colonnes dans l'ordre, puis 5/ exécuter avecrake db:migrate
. Il a travaillé pour moi.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez appeler
change_column
, mais vous devez répéter le type de colonne (il suffit de copier et coller à partir de votre autre migration):Ou si vous devez réorganiser plusieurs colonnes dans une table:
change_column
appelsALTER TABLE
sous le capot. À partir de la base de données MySQL la documentation:def change
au lieu deup
etdown
?change_column
. Avez-vous vraiment besoin de revenir à l'ordre des colonnes?up
au lieu dechange
?up
pour un "one way" de la migration. À l'aide dechange
déclenche une exception lors de la restauration si les Rails ne peut pas inverser la migration définition, sauf si vous êtes à l'aide dereversible
.De Stefan solution est idéale si vous avez affaire avec seulement une poignée de colonnes. Si vous avez plusieurs colonnes pour être ré-arrangé ET arrive d'être sur un Mac, je vous suggère de prendre un coup d'oeil à Sequel Pro, une chouette base de données de l'outil de gestion qui fait de la réorganisation des colonnes de base de données un jeu d'enfant. Il suffit de glisser et déposer.
PS: je ne suis pas affilié avec eux de toute façon.