Lancer un seul fichier de migration

y a-t-il un moyen facile d'effectuer une seule migration? Je ne veux pas migrer vers une certaine version, je veux juste faire un spécifique.

229
demandé sur nan 2009-04-16 02:03:04

10 réponses

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

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

Note: les nouvelles versions de rails peuvent exiger AddFoos.new.up plutôt que AddFoos.up .

une voie alternative (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, il ne mettra probablement pas à jour la table schema_migrations , mais il semble que c'est ce que vous voulez de toute façon.

210
répondu Orion Edwards 2016-11-04 23:18:23

en supposant une version assez récente des Rails, vous pouvez toujours exécuter:

rake db:migrate:up VERSION=20090408054532

où version est l'horodatage dans le nom du fichier de migration.

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

355
répondu gtd 2018-06-30 15:23:28

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

$ rake db:migrate:up VERSION=20080906120000

Si vous voulez exécuter les migrations plusieurs fois , faire

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

Si vous voulez exécuter un unique migration multiple , ne

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

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


modifier: vous pouvez aussi simplement renommer votre fichier de migration, par exemple:

20151013131830_my_migration.rb -> 20151013131831_my_migration.rb

ensuite migrer Normalement, cela traitera la migration comme une nouvelle (utile si vous voulez migrer sur un environnement distant (comme la staging) sur lequel vous avez moins de contrôle.

Edit 2 : vous pouvez également tout simplement nuke 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 reprendra alors la méthode up des migrations nuquées.

94
répondu Benjamin Crouzier 2015-11-02 10:07:32

si vous avez implémenté une méthode change comme ceci:

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)
24
répondu chibicode 2013-07-24 21:20:16

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

  1. exécutez le mode console. (rails c)
  2. copiez et passez la classe qui est dans ce fichier à 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écute la méthode change de cette instance: c1.change
15
répondu rolph dzounga 2015-09-28 02:55:25

si vous avez des problèmes avec les chemins que vous pouvez utiliser""

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
11
répondu Dejan Cancarevic 2014-10-23 10:18:26

à partir de rails 5 vous pouvez également utiliser 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
11
répondu Deepak Mahakale 2017-09-23 17:33:16

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

5
répondu viniciusnz 2012-02-26 02:27:52

Méthode 1:

rake db:migrate:up VERSION=20080906120000

Méthode 2:

Dans La Console Des Rails 1. Copier coller la classe de migration dans la console (par exemple add_name_to_user.RB) 2. Puis, dans la console, tapez

Sharding.run_on_all_shards{AddNameToUser.up}

C'est fait!!

5
répondu ramya 2015-05-26 08:41:55

ressemble au moins dans la dernière version de Rails (5.2 au moment de l'écriture) il y a une autre façon de filtrer les migrations en cours. On peut passer un filtre dans une variable d'environnement SCOPE qui serait alors 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 en cours d'exécution

SCOPE=run_this_one rails db:migrate:up

sélectionnera et exécutera seulement 2_add_foos.run_this_one.rb . Gardez à l'esprit que tous les fichiers de migration correspondant à la portée va être exécuté.

1
répondu szymek 2018-04-10 07:57:45