Czy istnieje prosty sposób na uruchomienie pojedynczej migracji? Nie chcę migrować do określonej wersji. Chcę tylko uruchomić określoną.
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:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
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:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Zauważ, że jeśli to zrobisz, prawdopodobnie nie zaktualizuje schema_migrations
tabeli, ale wygląda na to, że i tak tego chcesz.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
następnieAddFoos.new.up
change
zamiast up
i down
, musisz uruchomićAddFoos.new.migrate(:up)
AddFoos.new.change
Zakładając dość nową wersję Railsów, zawsze możesz uruchomić:
rake db:migrate:up VERSION=20090408054532
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 uruchom rake db:migrate:redo VERSION=20090408054532
zamiast tego.
rake db:migrate:down VERSION=XXX
Jeśli chcesz uruchomić określoną migrację , wykonaj
$ rake db:migrate:up VERSION=20080906120000
Jeśli chcesz uruchamiać migracje wiele razy , zrób to
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Jeśli chcesz uruchomić jedną migrację wiele razy, zrób to
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(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:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
ponownie uruchomi up
metodę nukowanych migracji.
Jeśli zastosowałeś taką change
metodę:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
Możesz utworzyć instancję migracji i uruchomić ją migrate(:up)
lub migrate(:down)
na instancji w następujący sposób:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
i down
.
Oto kroki, aby ponownie uruchomić ten plik migracji „20150927161307_create_users.rb”
Skopiuj i wklej klasę znajdującą się w tym pliku na konsolę.
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
Utwórz instancję klasy CreateUsers
:c1 = CreateUsers.new
change
tego wystąpienia:c1.change
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 klasie CreateUsers.new.change
.
Od rails 5
teraz można również użyć rails
zamiastrake
Szyny 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Szyny 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Jeśli masz problemy ze ścieżkami, możesz użyć
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Zauważ, że zamiast tego script/runner
może być konieczne użycie rails runner
w nowych środowiskach szyn.
Jeśli chcesz uruchomić go z konsoli, właśnie tego szukasz:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
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ć.
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
i 2_add_foos.run_this_one.rb
działa
SCOPE=run_this_one rails db:migrate:up
wybierze i uruchomi tylko 2_add_foos.run_this_one.rb
. Należy pamiętać, że wszystkie pliki migracji pasujące do zakresu zostaną uruchomione.