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.
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.
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
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 require retourne un tableau de noms de classe:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Notez que si vous faites cela, cela ne mettra probablement pas à jour le schema_migrations
tableau, mais il semble que c'est ce que vous voulez de toute façon.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
alorsAddFoos.new.up
change
place de up
et down
, vous devrez exécuterAddFoos.new.migrate(:up)
AddFoos.new.change
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 du nom de fichier de la migration.
Edit: à un moment donné au cours des 8 dernières années (je ne sais pas quelle version) Rails a ajouté des contrôles qui empêchent cela de fonctionner s'il a déjà été exécuté. Ceci est indiqué par une entrée dans le schema_migrations
tableau. Pour le réexécuter, exécutez simplement à la rake db:migrate:redo VERSION=20090408054532
place.
rake db:migrate:down VERSION=XXX
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 une seule migration plusieurs fois, faites
# 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)
Modifier: Vous pouvez également simplement renommer 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 transfert) sur lequel vous avez moins de contrôle.
Edit 2 : Vous pouvez également simplement supprimer 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
va ensuite relancer la up
méthode des migrations nucléaires.
Si vous avez implémenté une change
méthode 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)
up
et down
.
Voici les étapes pour relancer ce fichier de migration "20150927161307_create_users.rb"
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
Créez une instance de la classe CreateUsers
:c1 = CreateUsers.new
change
de cette instance:c1.change
require "./db/migrate/20150927161307_create_users.rb"
au lieu de copier et coller. Vous pouvez ensuite exécuter la classe de la même manière en instanciant et en appelant la méthode définie dans la classe CreateUsers.new.change
.
En tant que rails 5
vous pouvez également utiliser rails
au lieu derake
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
rails db:migrate VERSION=20160920130051
Si vous rencontrez des problèmes avec les chemins que vous pouvez utiliser
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
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. Ensuite, dans la console, saisissez ce qui suit
Sharding.run_on_all_shards{AddNameToUser.up}
C'est fait!!
Veuillez noter qu'au lieu de script/runner
, vous devrez peut-être utiliser rails runner
sur de nouveaux environnements de rails.
Si vous souhaitez l'exécuter à partir de la console, voici ce que vous recherchez:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
J'ai essayé les autres réponses, mais nécessitant sans Rails.root
n'a pas fonctionné pour moi.
De plus, .migrate(:up)
part force la migration à être réexécutée, qu'elle ait déjà été exécutée ou non. Cela est utile lorsque vous avez déjà exécuté une migration, que vous l'avez un peu annulée en jouant avec la base de données et que vous souhaitez une solution rapide pour la réactiver.
Il semble qu'au moins dans la dernière version de Rails (5.2 au moment de la rédaction), il existe une autre façon de filtrer les migrations en cours d'exécution. On peut passer un filtre dans une SCOPE
variable d'environnement qui serait ensuite utilisé pour sélectionner les fichiers de migration.
En supposant que vous avez deux fichiers de migration 1_add_foos.rb
et en 2_add_foos.run_this_one.rb
cours d'exécution
SCOPE=run_this_one rails db:migrate:up
sélectionnera et s'exécutera uniquement 2_add_foos.run_this_one.rb
. Gardez à l'esprit que tous les fichiers de migration correspondant à la portée seront exécutés.