Czy istnieje prosty sposób na uruchomienie pojedynczej migracji? Nie chcę migrować do określonej wersji. Chcę tylko uruchomić określoną.
267
Czy istnieje prosty sposób na uruchomienie pojedynczej migracji? Nie chcę migrować do określonej wersji. Chcę tylko uruchomić określoną.
Odpowiedzi:
Możesz po prostu uruchomić kod bezpośrednio z pliku ruby:
Uwaga: nowsze wersje szyn mogą wymagać
AddFoos.new.up
raczej niżAddFoos.up
.Alternatywny sposób (bez IRB), który polega na tym, że wymaga zwrócenia tablicy nazw klas:
Zauważ, że jeśli to zrobisz, prawdopodobnie nie zaktualizuje
schema_migrations
tabeli, ale wygląda na to, że i tak tego chcesz.źródło
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
następnieAddFoos.new.up
change
zamiastup
idown
, musisz uruchomićAddFoos.new.migrate(:up)
AddFoos.new.change
Zakładając dość nową wersję Railsów, zawsze możesz uruchomić:
Gdzie wersja jest znacznikiem czasu w nazwie pliku migracji.
Edycja: W pewnym momencie w ciągu ostatnich 8 lat (nie jestem pewien, która wersja) Railsy dodały kontrole, które uniemożliwiają uruchomienie tego programu, jeśli został już uruchomiony. Wskazuje na to wpis w
schema_migrations
tabeli. Aby ponownie uruchomić, po prostu uruchomrake db:migrate:redo VERSION=20090408054532
zamiast tego.źródło
rake db:migrate:down VERSION=XXX
Jeśli chcesz uruchomić określoną migrację , wykonaj
Jeśli chcesz uruchamiać migracje wiele razy , zrób to
Jeśli chcesz uruchomić jedną migrację wiele razy, zrób to
(numer wersji można znaleźć w nazwie pliku migracji)
Edycja: Możesz także po prostu zmienić nazwę pliku migracji, np .:
20151013131830_my_migration.rb
->20151013131831_my_migration.rb
Następnie migruj normalnie, spowoduje to potraktowanie migracji jako nowej (przydatne, jeśli chcesz przeprowadzić migrację w środowisku zdalnym (takim jak przemieszczanie), nad którym masz mniejszą kontrolę.
Edycja 2 : Możesz także po prostu nuke wpis migracji w bazie danych. Na przykład:
rake db:migrate
ponownie uruchomiup
metodę nukowanych migracji.źródło
Jeśli zastosowałeś taką
change
metodę:Możesz utworzyć instancję migracji i uruchomić ją
migrate(:up)
lubmigrate(:down)
na instancji w następujący sposób:źródło
up
idown
.Oto kroki, aby ponownie uruchomić ten plik migracji „20150927161307_create_users.rb”
Skopiuj i wklej klasę znajdującą się w tym pliku na konsolę.
Utwórz instancję klasy
CreateUsers
:c1 = CreateUsers.new
change
tego wystąpienia:c1.change
źródło
require "./db/migrate/20150927161307_create_users.rb"
zamiast kopiowania i wklejania. Następnie możesz uruchomić klasę w ten sam sposób, tworząc instancję i wywołując metodę zdefiniowaną w klasieCreateUsers.new.change
.Od
rails 5
teraz można również użyćrails
zamiastrake
Szyny 3 - 4
Szyny 5
źródło
rails db:migrate VERSION=20160920130051
Jeśli masz problemy ze ścieżkami, możesz użyć
źródło
Metoda 1:
Metoda 2:
W Rails Console 1. Skopiuj wklej klasę migracji do konsoli (powiedz add_name_to_user.rb) 2. Następnie w konsoli wpisz następujące polecenie
Zrobione!!
źródło
Zauważ, że zamiast tego
script/runner
może być konieczne użycierails runner
w nowych środowiskach szyn.źródło
Jeśli chcesz uruchomić go z konsoli, właśnie tego szukasz:
Próbowałem innych odpowiedzi, ale wymaganie bez
Rails.root
mnie nie działało.Ponadto
.migrate(:up)
część wymusza ponowne uruchomienie migracji, niezależnie od tego, czy została już uruchomiona, czy nie. Jest to przydatne, gdy już uruchomiłeś migrację, jakbyś ją cofnął, bawiąc się z db i chce szybkiego rozwiązania, aby ją ponownie uruchomić.źródło
Wygląda na to, że przynajmniej w najnowszej wersji Railsów (5.2 w momencie pisania) istnieje jeszcze jeden sposób filtrowania przeprowadzanych migracji. W
SCOPE
zmiennej środowiskowej można przekazać filtr, który byłby następnie używany do wybierania plików migracji.Zakładając, że masz dwie migracji plików
1_add_foos.rb
i2_add_foos.run_this_one.rb
działawybierze i uruchomi tylko
2_add_foos.run_this_one.rb
. Należy pamiętać, że wszystkie pliki migracji pasujące do zakresu zostaną uruchomione.źródło