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.upraczej 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_migrationstabeli, 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
changezamiast upi 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_migrationstabeli. Aby ponownie uruchomić, po prostu uruchom rake db:migrate:redo VERSION=20090408054532zamiast 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:migrateponownie uruchomi upmetodę nukowanych migracji.
Jeśli zastosowałeś taką changemetodę:
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)
upi 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
endUtwórz instancję klasy CreateUsers:c1 = CreateUsers.new
changetego wystąpienia:c1.changerequire "./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 5teraz można również użyć railszamiastrake
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/runnermoże być konieczne użycie rails runnerw 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.rootmnie 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 SCOPEzmiennej ś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.rbi 2_add_foos.run_this_one.rbdział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.