Rake juste une migration

94

J'essaie d'exécuter une seule migration sur tout un tas dans mon application rails. Comment puis-je faire ceci? Je ne souhaite exécuter aucune des migrations avant ou après. Merci.

Anon
la source
1
Ce serait une fonctionnalité de rails pratique: ajoutez un STEP=nargument à db:migrate(où nest le nombre de migrations à exécuter, comme il y en a pour db:rollback) - alors vous pouvez faire rake db:migrate STEP=1ou rake db:migrate STEP=2, etc.
user664833

Réponses:

164

rake db:migrate:redo VERSION=xxxxxxx, mais cela exécutera downl' upétape, puis l' étape. Vous pouvez le faire conjointement en commentant temporairement l'étape descendante.

Ryan Bigg
la source
Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo ne semble pas prendre d'argument VERSION.
Terry G Lorber
3
@pedrorolo: Ce n'est pas obsolète. Cette tâche n'a pas de description et n'apparaîtra donc pas dans rake -T.
Ryan Bigg
1
@pedrorolo: db:test:preparen'apparaît pas non plus sur cette liste. Dieu, je suis en retard à la fête.
mraaroncruz
9
Pour développer ce que dit Ryan, si la table a été supprimée de la base de données en dehors de Rails, rake db:migrate:up VERSION=my_versionpeut ne rien faire , car la table schema_migrations indique toujours qu'elle a été exécutée. Dans la même situation rake db:migrate:redo VERSION=my_versionpeut échouer car il ne peut pas supprimer la table. Dans ce cas, commentez downtemporairement la méthode dans la migration et relancez-larake db:migrate:redo...
Leo
3
Et pour développer ce que dit @Leo, si la migration est définie avec def change, changez-la en def self.up en plus de ce qui précède.
valk
70
rake db:migrate:up VERSION=1234567890

de même rake db:migrate:downpour réduire une migration spécifique. Vous pouvez obtenir une liste des tâches de râteau disponibles avec rake -T.

Shadwell
la source
4
Le VERSIONmentionné ici est la valeur entière au début de chacun de vos fichiers de migration (qui est juste l'horodatage de sa création). Par exemple VERSION=20150720023630,.
aaron-coding le
3
Les versions sont bien affichées avec rake db: migrate: status
jpgeek
Il convient de noter, VERSIONest juste une variable d'environnement afin qu'elle puisse venir en premier dans la commande ou même définir avant la commande:VERSION=1234567890 rake db:migrate:up
Joshua Pinter
25

J'ai dû exécuter une seule migration qui a changé et qui 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.


la source
6
Cela a fonctionné à merveille. Vous pouvez également simplement copier-coller le code de la migration dans la console pour définir la classe (et cela permet une manipulation manuelle si nécessaire, si vous venez de faire une erreur sur Dev, par exemple). Si vous avez défini une migration réversible avec change, exécutez à la YourMigrations.migrate(:up)place (ou :downaussi!)
trisweb
1
vous pourriez avoir àrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2
15

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

reshma
la source
10
rake db:migrate VERSION=20098252345

essayez cela.

JP Silvashy
la source
7
Je pense que cela exécutera toutes les migrations jusqu'à celle que vous avez spécifiée.
Ken Liu
1
close, mais qui exécute également toutes les migrations avant la migration spécifique.
Anon
6
Je ne pense pas que vous devriez / voulez exécuter une seule migration sans considérer celles qui la précèdent. Une migration est une représentation de la structure des bases de données en ce qui concerne le code à un moment donné, et donc les migrations avant qu'elles ne soient nécessaires. Si vous ne souhaitez exécuter qu'une seule migration, il est probable que vous n'ayez pas écrit les opérations de montée / descente appropriées pour maintenir les migrations fonctionnelles ... c'est une mauvaise habitude de n'écrire que vos migrations ascendantes.
JP Silvashy
1
À noter: VERSIONest juste une variable d'environnement afin qu'elle puisse venir en premier dans la commande ou même être définie avant la commande:VERSION=20098252345 rake db:migrate
Joshua Pinter
4
rake db:migrate:redo version='xxxx'   

N'oubliez pas de mettre entre guillemets xxxx, xxxx est l'horodatage (ou ID de migration) de 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    
hexinpètre
la source
3

L'élargissement de la réponse par korch ci-dessus requiren'a pas fonctionné pour moi, mais loada 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.

bhfailor
la source
2

Ajout de mes 2 ¢ à cela parce que j'ai rencontré le même problème:

Si vous souhaitez absolument réexécuter 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 les rails «oublieront» 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 du 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 en 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 revenir en arrière et réessayer à plusieurs reprises.

Ken Simon
la source
1

Il doit y avoir un moyen d'exécuter la classe de migration via la console. Je n'arrive pas à faire reconnaître le code des migrations.

Cependant, comme l'indiquent les commentaires, 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 le script / la console?

Terry G Lorber
la source
0

J'utilise cette technique en 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 (surtout lorsque j'importe des données héritées qui prennent beaucoup de temps. Je ne veux pas avoir à réimporter à nouveau).

C'est 100% hackish et je ne recommanderais certainement pas de le faire en production, mais cela fera l'affaire:

  1. Déplacer 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
Greg Blass
la source