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
Odpowiedz
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ół.
Hmm, http://blog.stonean.com/2007/12/18/rake-dbmigrateredo/, :: redo nie wydaje się przyjmować argumentu VERSION. –
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. –
Dlaczego więc Stackoverflow powinien wyświetlać nieaktualne informacje? Jeśli teraz uruchomisz 'rake-T', nie ma zadania o nazwie' db: migrate: redo' –
rake db:migrate VERSION=20098252345
wypróbuj.
Myślę, że spowoduje to przeprowadzenie migracji do wybranej przez Ciebie. –
zamknij, ale to także uruchamia wszelkie migracje przed określoną migracją. – Anon
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. –
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?
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
.
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". –
Wersje są ładnie wyświetlane z rake db: migrate: status – jpgeek
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
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
możesz potrzebować 'require '# {Rails.root}/db/migrate/your_migrations.rb "' – s2t2
Mam metodę narzędziowy, który sprawia, że to bardzo łatwe w rozwoju. Uważam, że pomaga mi to uniknąć tworzenia zbyt wielu migracji - zwykle modyfikuję migracje, dopóki nie zostaną wdrożone.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
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
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.
Genialny, działa bezbłędnie! – Loed
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
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.
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:
- Move migracji, które chcesz ponownie uruchomić z jego katalogu do tymczasowego miejsca
- wygenerować kolejną migrację o tej samej nazwie
- Kopiuj/wklej oryginalny kod migracji do nowo wygenerowanym pliku migracji
- Run nowy migracji
- Usuń nowo ge nerated plik migracji
- zmieniać swoich migracje schematu, aby usunąć ostatnią wartość
- Przywróć stary plik migracji
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