web-dev-qa-db-fra.com

Exécuter un seul fichier de migration

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

250
nan

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 de Rails peuvent nécessiter AddFoos.new.up plutôt que AddFoos.up.

Une autre manière (sans IRB) qui repose sur le fait que require renvoie un tableau de noms de classe:

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

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

230
Orion Edwards

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

rake db:migrate:up VERSION=20090408054532

Où version correspond à 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 la version) _ Rails ajouté des contrôles qui empêchent son exécution si elle a déjà été exécutée. Ceci est indiqué par une entrée dans la table schema_migrations. Pour la réexécuter, exécutez simplement rake db:migrate:redo VERSION=20090408054532 à la place.

400
gtd

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

$ rake db:migrate:up VERSION=20080906120000

Si vous voulez 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 une migration unique multiple , effectuez

# 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 également renommer simplement votre fichier de migration, par exemple:

20151013131830_my_migration.rb -> 20151013131831_my_migration.rb

Ensuite, migrez normalement, cela traitera la migration comme une 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 archiver l'entrée de migration dans la base de données. Par exemple:

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

rake db:migrate réexécutera ensuite la méthode up des migrations instantanées.

104

Si vous avez implémenté une méthode 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)
25
chibicode

Voici les étapes à suivre pour exécuter à nouveau ce fichier de migration "20150927161307_create_users.rb"

  1. Exécutez le mode console. (Rails c)
  2. Copiez et collez 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éer une instance de la classe CreateUsers: c1 = CreateUsers.new

  4. Exécutez la méthode change de cette instance: c1.change
15
rolph dzounga

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

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

À partir de Rails 5, vous pouvez également utiliser Rails à la place 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
11
Deepak Mahakale

Veuillez noter qu'au lieu de script/runner, vous devrez peut-être utiliser Rails runner sur les nouveaux environnements Rails.

5
viniciusnz

Méthode 1:

rake db:migrate:up VERSION=20080906120000

Méthode 2:

Dans Rails Console 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!!

5
ramya

Au moins dans la dernière version de Rails (5.2 au moment de l'écriture), 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é pour sélectionner les fichiers de migration.

En supposant que vous ayez deux fichiers de migration 1_add_foos.rb et 2_add_foos.run_this_one.rb en 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. N'oubliez pas que tous les fichiers de migration correspondant à l'étendue seront exécutés.

1
szymek