Exécuter un seul fichier de migration

Existe-t-il un moyen simple d’exécuter une seule migration? Je ne veux pas migrer vers une certaine version, je veux juste en exécuter une spécifique.

Vous pouvez simplement exécuter le code directement à partir du fichier ruby:

rails console >> require "db/migrate/20090408054532_add_foos.rb" >> AddFoos.up 

Remarque: les versions plus récentes des rails peuvent nécessiter AddFoos.new.up plutôt que AddFoos.up .

Une manière alternative (sans IRB) qui repose sur le fait que requirejs un tableau de noms de classes:

 script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up' 

Notez que si vous faites cela, cela ne mettra probablement pas à jour la table schema_migrations , mais il semble que ce soit ce que vous voulez de toute façon.

En supposant une version assez récente de Rails, vous pouvez toujours exécuter:

 rake db:migrate:up VERSION=20090408054532 

Où version est l’horodatage dans le nom de fichier de la migration.

Edit: À un moment donné au cours des 8 dernières années (je ne suis pas sûr de quelle version) Rails a ajouté des vérifications qui l’empêchent de s’exécuter s’il a déjà été exécuté. Ceci est indiqué par une entrée dans la table schema_migrations . Pour le réexécuter, exécutez simplement rake db:migrate:redo VERSION=20090408054532 place.

Si vous souhaitez exécuter une migration spécifique , faites

 $ rake db:migrate:up VERSION=20080906120000 

Si vous souhaitez exécuter des migrations plusieurs fois , faites

 # use the STEP parameter if you need to go more than one version back $ rake db:migrate:redo STEP=3 

Si vous souhaitez exécuter plusieurs fois une seule migration, procédez comme suit:

 # this is super useful $ rake db:migrate:redo VERSION=20080906120000 

(vous pouvez trouver le numéro de version dans le nom de fichier de votre migration)


Edit: Vous pouvez aussi simplement renommer votre fichier de migration, par exemple:

20151013131830_my_migration.rb -> 20151013131831_my_migration.rb

Puis, migrez normalement, cela traitera la migration comme nouvelle (utile si vous souhaitez migrer sur un environnement distant (tel que le stockage intermédiaire) sur lequel vous avez moins de contrôle.

Edit 2 : Vous pouvez également nuke l’entrée de migration dans la firebase database. Par exemple:

 rails_c> q = "delete from schema_migrations where version = '20151013131830'" rails_c> ActiveRecord::Base.connection.execute(q) 

rake db:migrate va alors relancer la méthode up des migrations nuked.

Si vous avez implémenté une méthode de change comme celle-ci:

 class AddPartNumberToProducts < ActiveRecord::Migration def change add_column :products, :part_number, :string end end 

Vous pouvez créer une instance de la migration et exécuter migrate(:up) ou migrate(:down) sur une instance, comme ceci:

 $ rails console >> require "db/migrate/20090408054532_add_part_number_to_products.rb" >> AddPartNumberToProducts.new.migrate(:down) 

Ce sont les étapes pour réexécuter ce fichier de migration “20150927161307_create_users.rb”

  1. Exécutez le mode console. (rails c)
  2. Copiez et passez la classe qui se trouve dans ce fichier sur la console.

     class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name t.string :email t.timestamps null: false end end end end 
  3. Créez une instance de la classe CreateUsers : c1 = CreateUsers.new

  4. Exécutez le change de méthode de cette instance: c1.change

Si vous rencontrez des problèmes avec les chemins que vous pouvez utiliser

 require Rails.root + 'db/migrate/20090408054532_add_foos.rb' 

Comme pour les rails 5 vous pouvez également utiliser des rails au lieu de rake

Rails 3 – 4

 # < rails-5.0 rake db:migrate:up VERSION=20160920130051 

Rails 5

 # >= rails-5.0 rake db:migrate:up VERSION=20160920130051 # or rails db:migrate:up VERSION=20160920130051 

Veuillez noter qu’au lieu de script/runner , vous devrez peut-être utiliser des rails runner dans les nouveaux environnements de rails.

Méthode 1:

 rake db:migrate:up VERSION=20080906120000 

Méthode 2:

Dans la console Rails 1. Copiez collez la classe de migration dans la console (par exemple, add_name_to_user.rb) 2. Dans la console, tapez ce qui suit

 Sharding.run_on_all_shards{AddNameToUser.up} 

C’est fait!!

On dirait au moins dans la dernière version de Rails (version 5.2 au moment de la rédaction du présent document), il existe un autre moyen de filtrer les migrations en cours. On peut passer un filtre dans une variable d’environnement SCOPE qui serait ensuite utilisée pour sélectionner les fichiers de migration.

En supposant que vous avez deux fichiers de migration 1_add_foos.rb et 2_add_foos.run_this_one.rb cours d’exécution

 SCOPE=run_this_one rails db:migrate:up 

sélectionnera et exécutera uniquement 2_add_foos.run_this_one.rb . Gardez à l’esprit que tous les fichiers de migration correspondant à la scope seront exécutés.