2009-08-25 18 views
73

Próbuję uruchomić tylko jedną migrację z całej garści w mojej aplikacji rails. Jak mogę to zrobić? Nie chcę uruchamiać żadnej z migracji przed ani po niej. Dzięki.Rake tylko jedna migracja

+0

byłoby to wygodne poręcze wyposażone: dodanie 'STEP = n' argument' db: migrować '(gdzie' n' to liczba migracji do uruchomienia, tak jak w przypadku 'db: rollback') - wtedy możesz zrobić:' rake db: migrate STEP = 1' lub 'rake db: migrate STEP = 2', itp. – user664833

Odpowiedz

141

rake db:migrate:redo VERSION=xxxxxxx, ale zostanie uruchomiony krok down, a następnie up. Możesz to zrobić w połączeniu z chwilowym komentowaniem kroku w dół.

+0

Hmm, http://blog.stonean.com/2007/12/18/rake-dbmigrateredo/, :: redo nie wydaje się przyjmować argumentu VERSION. –

+0

Działa, przetestowałem to. Należy zauważyć, że artykuł pochodzi z DWÓCH TYSIĄC I SIEDEM. Railsy bardzo się zmieniają w tym czasie. –

+0

Dlaczego więc Stackoverflow powinien wyświetlać nieaktualne informacje? Jeśli teraz uruchomisz 'rake-T', nie ma zadania o nazwie' db: migrate: redo' –

7
rake db:migrate VERSION=20098252345 

wypróbuj.

+6

Myślę, że spowoduje to przeprowadzenie migracji do wybranej przez Ciebie. –

+1

zamknij, ale to także uruchamia wszelkie migracje przed określoną migracją. – Anon

+4

Nie sądzę, że powinieneś/chcesz uruchamiać tylko jedną migrację bez uwzględnienia wcześniejszych. Migracja jest reprezentacją struktury baz danych, ponieważ odnosi się do kodu w danym momencie, a zatem migracje przed nim są konieczne. Jeśli chcesz tylko uruchomić _na_ migrację, prawdopodobnie nie zapisałeś odpowiednich operacji w górę/w dół, aby migracja była funkcjonalna ... to jest zły nawyk, aby pisać swoje migracje. –

0

Musi być sposób na uruchomienie klasy migracji za pośrednictwem konsoli. Nie wydaje mi się, żeby kod migracji był rozpoznawalny.

Jednak, jak zaznaczają komentarze, preferowane jest przeprowadzenie migracji w kolejności. Użyj:

rake db:migrate VERSION=########## 

Skopiuj i wklej swój kod w migracji do skryptu/konsoli?

57
rake db:migrate:up VERSION=1234567890 

podobnie rake db:migrate:down, aby wykonać konkretną migrację w dół. Możesz uzyskać listę dostępnych rake zadań z rake -T.

+3

Wspomniana tutaj "WERSJA" jest wartością całkowitą na początku każdego pliku migracji (jest to tylko znacznik czasu, kiedy została utworzona). Na przykład "VERSION = 20150720023630". –

+1

Wersje są ładnie wyświetlane z rake db: migrate: status – jpgeek

23

Musiałem przeprowadzić pojedynczą migrację, która uległa zmianie i trzeba ją było ponownie uruchomić niezależnie od wszystkich innych migracji. Odpalić konsolę i to zrobić:

>> require 'db/migrate/your_migrations.rb' 
=> ["YourMigrations"] 
>> YourMigrations.up 
=> etc... as the migration runs 
>> YourMigration.down 

Więcej użytecznie to może być wprowadzone do zadania natarcia itd

+6

To działało niesamowicie. Możesz także po prostu skopiować i wkleić kod z migracji do konsoli, aby zdefiniować klasę (i to pozwoli na ręczną manipulację, jeśli zajdzie taka potrzeba, na przykład jeśli popełnisz błąd na Dev). Jeśli zdefiniowałeś odwracalną migrację z 'change', uruchom' YourMigrations.migrate (: up) 'zamiast (lub': down' też!) – trisweb

+0

możesz potrzebować 'require '# {Rails.root}/db/migrate/your_migrations.rb "' – s2t2

6

rake db:migrate:up VERSION=version_no

będą migrować (dodaj) specyficzny scenariusz migracji

rake db:migrate:down VERSION=version_no

kasuje konkretny skrypt do migracji

3

Rozwijając na odpowiedź przez Korch powyżej require zrobił nie działa dla mnie, ale load zrobił. Aby być beton, dla pliku migracji:

class ChangeMinQuantityToRaces < ActiveRecord::Migration 
     def change 
     change_column :races, :min_quantity, :integer, :default => 0 
     end 
    end 

w konsoli wpisując

> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb' 
    > ChangeMinQuantityToRaces.new.change 

pracował dla mnie.

> Race.new.min_quantity # => 0 

To Ruby 1.9.3p484 (22.11.2013 zmiany 43786) [x86_64-Linux] Szyny i 3.2.13.

+0

Genialny, działa bezbłędnie! – Loed

3
rake db:migrate:redo version='xxxx' 

Pamiętaj o umieszczeniu cudzysłowu wokół xxxx, xxxx to znacznik czasu (lub identyfikator migracji) dla migracji.

Możesz sprawdzić znaczniki czasu (migracja ID) dla poprzednich wędrówek zrobiłeś za pomocą

rake db:migrate:status  
1

Dodawanie moje 2 ¢ to dlatego wpadłem na tej samej kwestii:

Jeśli absolutnie chce uruchomić migrację kółko bez tworzenia nowego, można wykonać następujące czynności:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

i szyn będzie " zapomnij ", że uruchomił migrację do 20150105181157. Teraz po uruchomieniu db: migrate uruchomi go ponownie.

To jednak prawie zawsze zły pomysł. Jedynym przypadkiem, w którym może to mieć sens, jest posiadanie gałęzi rozwojowej i jeszcze nie opracowałeś swojej migracji i chcesz dodać kilka rzeczy do rozwoju. Ale nawet wtedy lepiej jest przeprowadzić twoją migrację dwukierunkową, abyś mógł poprawnie przywrócić i ponawiać próbę wielokrotnie.

0

Używam tej techniki w fazie rozwoju, kiedy zmienię migrację na znaczną ilość i nie chcę migrować mniej niż tonę i tracić jakiekolwiek dane po drodze (zwłaszcza, gdy importuję starsze dane, które wymagają przez długi czas, że nie chcę ponownie importować).

Jest to 100% hackish a ja zdecydowanie nie polecam robić to w produkcji, ale będzie to rade:

  1. Move migracji, które chcesz ponownie uruchomić z jego katalogu do tymczasowego miejsca
  2. wygenerować kolejną migrację o tej samej nazwie
  3. Kopiuj/wklej oryginalny kod migracji do nowo wygenerowanym pliku migracji
  4. Run nowy migracji
  5. Usuń nowo ge nerated plik migracji
  6. zmieniać swoich migracje schematu, aby usunąć ostatnią wartość
  7. Przywróć stary plik migracji
Powiązane problemy