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.
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.
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.
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.
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)
Ce sont les étapes pour exécuter à nouveau ce fichier de migration "20150927161307_create_users.rb"
- exécutez le mode console. (rails c)
-
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
-
créer une instance de la classe
CreateUsers
:c1 = CreateUsers.new
- exécute la méthode
change
de cette instance:c1.change
si vous avez des problèmes avec les chemins que vous pouvez utiliser""
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
à 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
veuillez noter qu'au lieu de script/runner
, vous devrez peut-être utiliser rails runner
sur de nouveaux environnements de rails.
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!!
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é.