J'essaie d'exécuter une seule migration sur un tas dans mon application Rails. Comment puis-je faire? Je ne veux exécuter aucune des migrations avant ou après. Merci.
rake db:migrate:redo VERSION=xxxxxxx
, mais cela exécutera l'étape down
puis l'étape up
. Vous pouvez le faire conjointement avec la mise en commentaire temporaire de l'étape descendante.
rake db:migrate:up VERSION=1234567890
de même rake db:migrate:down
pour supprimer une migration spécifique. Vous pouvez obtenir une liste des tâches de râteau disponibles avec rake -T
.
J'ai dû exécuter une seule migration qui a changé et devait être réexécutée indépendamment de toutes les autres migrations. Lancez la console et procédez comme suit:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Plus utilement, cela pourrait être mis dans une tâche de râteau, etc.
rake db:migrate:up VERSION=version_no
Migrera (ajoutera) un script de migration spécifique
rake db:migrate:down VERSION=version_no
Supprime un script de migration spécifique
rake db:migrate VERSION=20098252345
essayez ça.
En développant la réponse de korch ci-dessus, require
n'a pas fonctionné pour moi, mais load
a fonctionné. Pour être concret, pour le fichier de migration:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
dans la console en tapant
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
travaillé pour moi.
> Race.new.min_quantity # => 0
C'était pour Ruby 1.9.3p484 (2013-11-22 révision 43786) [x86_64-linux] et Rails 3.2.13.
rake db:migrate:redo version='xxxx'
N'oubliez pas de mettre le guillemet autour de xxxx, xxxx est l'horodatage (ou ID de migration) pour votre migration.
Vous pouvez vérifier les horodatages (ID de migration) pour les migrations précédentes que vous avez effectuées en utilisant
rake db:migrate:status
Ajout de mon 2 ¢ à cela parce que je suis tombé sur ce même problème:
Si vous souhaitez absolument exécuter à nouveau une migration sans en créer une nouvelle, vous pouvez effectuer les opérations suivantes:
Rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';
Et Rails "oubliera" qu'il a exécuté la migration pour 20150105181157. Maintenant, lorsque vous exécutez db: migrate, il l'exécutera à nouveau.
C'est presque toujours une mauvaise idée. Le seul cas où cela pourrait avoir un sens est si vous avez une branche de développement et que vous n'avez pas encore étoffé votre migration et que vous souhaitez y ajouter des éléments dans le développement. Mais même dans ce cas, il est préférable d'effectuer votre migration dans les deux sens afin de pouvoir correctement annuler et réessayer à plusieurs reprises.
Il doit y avoir un moyen d'exécuter la classe de migration via la console. Je n'arrive pas à obtenir le code des migrations pour être reconnaissable.
Cependant, comme les commentaires l'indiquent, il est préférable d'exécuter les migrations dans l'ordre. Utilisation:
rake db:migrate VERSION=##########
Copiez et collez votre code dans la migration vers script/console?
J'ai une méthode utilitaire qui rend cela très facile à développer. Je trouve que cela m'aide à éviter de créer trop de migrations - normalement je modifie les migrations jusqu'à ce qu'elles soient déployées.
http://fullware.net/index.php/2011/05/26/easily-load-Rails-migrations-for-console-execution/
J'utilise cette technique dans le développement lorsque je modifie une migration de manière significative, et je ne veux pas migrer d'une tonne et perdre des données en cours de route (en particulier lorsque j'importe des données héritées qui prennent beaucoup de temps Je ne veux plus avoir à réimporter).
C'est 100% hackish et je ne recommanderais certainement pas de le faire en production, mais cela fera l'affaire: