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.
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.
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.
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.
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)
Voici les étapes à suivre pour exécuter à nouveau 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éer une instance de la classe CreateUsers
: c1 = CreateUsers.new
change
de cette instance: c1.change
Si vous rencontrez des problèmes avec les chemins, vous pouvez utiliser
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
À 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
Veuillez noter qu'au lieu de script/runner
, vous devrez peut-être utiliser Rails runner
sur les nouveaux environnements Rails.
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!!
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.