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.
267
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:
Remarque: les versions plus récentes des rails peuvent nécessiter
AddFoos.new.up
plutôt queAddFoos.up
.Une manière alternative (sans IRB) qui repose sur le fait que require retourne un tableau de noms de classe:
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.la source
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
alorsAddFoos.new.up
change
place deup
etdown
, vous devrez exécuterAddFoos.new.migrate(:up)
AddFoos.new.change
En supposant une version assez récente de Rails, vous pouvez toujours exécuter:
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 à larake db:migrate:redo VERSION=20090408054532
place.la source
rake db:migrate:down VERSION=XXX
Si vous souhaitez exécuter une migration spécifique , faites
Si vous souhaitez exécuter des migrations plusieurs fois , faites
Si vous souhaitez exécuter une seule migration plusieurs fois, faites
(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:
rake db:migrate
va ensuite relancer laup
méthode des migrations nucléaires.la source
Si vous avez implémenté une
change
méthode comme celle-ci:Vous pouvez créer une instance de la migration et exécuter
migrate(:up)
oumigrate(:down)
sur une instance, comme ceci:la source
up
etdown
.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.
Créez une instance de la classe
CreateUsers
:c1 = CreateUsers.new
change
de cette instance:c1.change
la source
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 classeCreateUsers.new.change
.En tant que
rails 5
vous pouvez également utiliserrails
au lieu derake
Rails 3 à 4
Rails 5
la source
rails db:migrate VERSION=20160920130051
Si vous rencontrez des problèmes avec les chemins que vous pouvez utiliser
la source
Méthode 1:
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
C'est fait!!
la source
Veuillez noter qu'au lieu de
script/runner
, vous devrez peut-être utiliserrails runner
sur de nouveaux environnements de rails.la source
Si vous souhaitez l'exécuter à partir de la console, voici ce que vous recherchez:
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.la source
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 en2_add_foos.run_this_one.rb
cours d'exécutionsé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.la source