web-dev-qa-db-fra.com

Rake juste une migration

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.

87
Anon

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.

159
Ryan Bigg
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.

69
Shadwell

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.

25
user46519

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

11
reshma
rake db:migrate VERSION=20098252345

essayez ça.

9
JP Silvashy

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.

3
user2001785
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    
3
hexinpeter

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.

2
Ken Simon

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?

1
Terry G Lorber

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/

1
aceofspades

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:

  1. Déplacez la migration que vous souhaitez réexécuter hors de son répertoire vers un emplacement temporaire
  2. Générer une autre migration avec le même nom
  3. Copiez/collez le code de migration d'origine dans le fichier de migration nouvellement généré
  4. Exécutez la nouvelle migration
  5. Supprimer le fichier de migration nouvellement généré
  6. Modifiez vos migrations de schéma pour supprimer la valeur la plus récente
  7. Restaurer l'ancien fichier de migration
0
Greg Blass