Uruchom pojedynczy plik migracji


267

Czy istnieje prosty sposób na uruchomienie pojedynczej migracji? Nie chcę migrować do określonej wersji. Chcę tylko uruchomić określoną.


Czy jest to coś, co uruchomiłeś kiedyś jako migrację, ponieważ okazało się, że było potrzebne, a następnie okazało się przydatnym zapytaniem, które może wymagać uruchomienia kilka razy? być może powinieneś refaktoryzować zawartość migracji do modelu lub innego obiektu, a następnie mieć odniesienie do migracji w tej nowej lokalizacji. Następnie możesz po prostu wykonać nowy obiekt na swój przydział, wywołując ruby ​​w wierszu poleceń.
Nathan Feger

Odpowiedzi:


239

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.


58
Czasami potrzebujesz „./” przed wymaganą ścieżką i zdecydowanie nie aktualizuje schema_migrations.
Beardo

14
Musiałem utworzyć instancję obiektu migracji, aby móc wywołać. np.AddFoos.new.up
Bentleyo

15
Podsumowując, Rails 3.2: require "./db/migrate/db/migrate/20090408054532_add_foos.rb"następnieAddFoos.new.up
trisweb

50
Jeśli Twoja migracja używa changezamiast upi down, musisz uruchomićAddFoos.new.migrate(:up)
Don Werve

6
W szynach 4 możesz zadzwonićAddFoos.new.change
lfender6445

429

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.


124
Właściwie to polecenie to rake db: migrate: redo VERSION = my_version
Chirag Patel

2
@Chirag Patel: Właśnie tego szukałem! Dzięki!
Abel,

23
Ponów uruchamia metodę down danej migracji, a następnie metodę up. up uruchamia tylko metodę up i myślę, że tego właśnie chce osoba pytająca.
Sven Koschnicke,

7
„up” wydaje się nie działać, jeśli wersja schematu bazy danych jest późniejsza niż migracja, o której mowa, co może się zdarzyć na przykład podczas scalania zmian innej osoby.
Matt Connolly,

3
Dzięki, użyłem tego na dół zrake db:migrate:down VERSION=XXX
Nitrodist

107

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.


Zarówno „up”, jak i „redo” nie działały dla mnie, ale usunięcie wiersza w schema_migrations było idealne.
cesoid

27

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)

1
Dotyczy to również, jeśli używasz upi down.
gak

17

Oto kroki, aby ponownie uruchomić ten plik migracji „20150927161307_create_users.rb”

  1. Uruchom tryb konsoli. (szyny c)
  2. 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
  3. Utwórz instancję klasy CreateUsers:c1 = CreateUsers.new

  4. Wykonaj metodę changetego wystąpienia:c1.change

po prostu wymagaj pliku z klasą, np. w konsoli: 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.
VinnyQ77

13

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

1
zgadnij również, czego potrzebujeszrails db:migrate VERSION=20160920130051
frenesim,

12

Jeśli masz problemy ze ścieżkami, możesz użyć

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

6

Metoda 1:

rake db:migrate:up VERSION=20080906120000

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

Sharding.run_on_all_shards{AddNameToUser.up}

Zrobione!!


5

Zauważ, że zamiast tego script/runnermoże być konieczne użycie rails runnerw nowych środowiskach szyn.


3

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ć.


1

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.