Zrób tylko jedną migrację


95

Próbuję przeprowadzić tylko jedną migrację z całej paczki w mojej aplikacji railsowej. Jak mogę to zrobić? Nie chcę uruchamiać żadnej migracji przed ani po niej. Dzięki.


2
To byłaby wygodna funkcja railsów: dodaj STEP=nargument do db:migrate(gdzie njest liczba migracji do uruchomienia, tak jak w przypadku db:rollback) - wtedy możesz zrobić rake db:migrate STEP=1lub rake db:migrate STEP=2itd.
user664833

Odpowiedzi:


165

rake db:migrate:redo VERSION=xxxxxxx, ale spowoduje to uruchomienie kroku, downa następnie up. Możesz to zrobić w połączeniu z tymczasowym komentowaniem kroku w dół.


Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo nie wydaje się przyjmować argumentu WERSJA.
Terry G Lorber

3
@pedrorolo: To nie jest nieaktualne. To zadanie nie ma opisu, więc nie pojawi się w rake -T.
Ryan Bigg,

1
@pedrorolo: db:test:preparerównież nie pojawia się na tej liście. Boże, spóźniłem się na przyjęcie.
mraaroncruz

9
Aby rozwinąć to, co mówi Ryan, jeśli tabela została usunięta z bazy danych poza Railsami, rake db:migrate:up VERSION=my_versionmoże nic nie zrobić , ponieważ tabela schema_migrations nadal mówi, że została uruchomiona. W tej samej sytuacji rake db:migrate:redo VERSION=my_versionmoże się nie powieść, ponieważ nie może usunąć tabeli. W takim przypadku downtymczasowo zakomentuj metodę w migracji i uruchom ponownierake db:migrate:redo...
Leo,

3
Aby rozszerzyć to, co mówi @Leo, jeśli migracja jest zdefiniowana ze zmianą def, zmień ją na def self.up oprócz powyższego.
valk

70
rake db:migrate:up VERSION=1234567890

podobnie, rake db:migrate:downaby wyłączyć określoną migrację. Możesz uzyskać listę dostępnych zadań rake za pomocą rake -T.


4
VERSIONWspomniano tutaj jest wartość całkowitą na początku każdego z plików migracji (co jest tylko znacznik czasu, kiedy został utworzony). Na przykład VERSION=20150720023630.
kodowanie aaron

3
Wersje ładnie się wyświetlają z rake db: migrate: status
jpgeek

Warto zauważyć, że VERSIONjest to tylko zmienna środowiskowa, więc może być pierwsza w poleceniu lub nawet ustawiona przed poleceniem:VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

Musiałem przeprowadzić pojedynczą migrację, która uległa zmianie i musiała zostać uruchomiona ponownie niezależnie od wszystkich innych migracji. Uruchom konsolę i zrób to:

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

Bardziej przydatne może być zadanie rake itp.


6
To zadziałało niesamowicie. Możesz także po prostu skopiować i wkleić kod z migracji do konsoli, aby zdefiniować klasę (a to pozwala na ręczną manipulację w razie potrzeby, jeśli na przykład popełniłeś błąd na Dev). Jeśli zdefiniowałeś migrację odwracalną za pomocą change, uruchom YourMigrations.migrate(:up)zamiast tego (lub :downteż!)
trisweb

1
być może będziesz musiałrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

16

rake db:migrate:up VERSION=version_no

Przeprowadzi migrację (doda) określony skrypt migracji

rake db:migrate:down VERSION=version_no

Usunie określony skrypt migracji


11
rake db:migrate VERSION=20098252345

spróbować.


8
Myślę, że spowoduje to uruchomienie wszelkich migracji do określonej przez Ciebie.
Ken Liu,

1
close, ale powoduje to również uruchomienie wszelkich migracji przed migracją określoną.
Anon

6
Nie sądzę, abyś mógł / chciał uruchomić tylko jedną migrację bez uwzględnienia poprzednich. Migracja to reprezentacja struktury baz danych w odniesieniu do kodu w danym momencie, a tym samym migracje, zanim będą konieczne. Jeśli chcesz uruchomić tylko jedną migrację, prawdopodobnie nie napisałeś odpowiednich operacji w górę / w dół, aby migracje działały ... to zły nawyk, aby zapisywać tylko migracje w górę.
JP Silvashy

1
Godne uwagi: VERSIONto tylko zmienna środowiskowa, więc może być pierwsza w poleceniu lub nawet ustawiona przed poleceniem:VERSION=20098252345 rake db:migrate
Joshua Pinter

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

Pamiętaj, aby umieścić cudzysłów wokół xxxx, xxxx to sygnatura czasowa (lub identyfikator migracji) migracji.

Możesz sprawdzić sygnatury czasowe (identyfikator migracji) poprzednich migracji wykonanych za pomocą

rake db:migrate:status    

3

Rozszerzanie odpowiedzi przez korch powyżej, requirenie działało dla mnie, ale działało load. Konkretnie, dla pliku migracji:

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

w wpisywaniu konsoli

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

pracował dla mnie.

    > Race.new.min_quantity # => 0 

Było to dla Ruby 1.9.3p484 (2013-11-22, wersja 43786) [x86_64-linux] i Rails 3.2.13.


2

Dodając do tego moje 2 ¢, ponieważ napotkałem ten sam problem:

Jeśli absolutnie chcesz ponownie przeprowadzić migrację bez tworzenia nowej, możesz wykonać następujące czynności:

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

Railsy „zapomną”, że przeprowadziły migrację dla 20150105181157. Teraz, kiedy uruchomisz db: migrate, uruchomi się ponownie.

Prawie zawsze jest to jednak zły pomysł. Jedynym przypadkiem, w którym może to mieć sens, jest sytuacja, w której masz gałąź programistyczną, a nie przygotowałeś jeszcze migracji i chcesz dodać do niej kilka rzeczy w trakcie opracowywania. Ale nawet wtedy lepiej jest przeprowadzić migrację dwukierunkową, aby można było poprawnie wycofać i wielokrotnie ponawiać.


1

Musi istnieć sposób na uruchomienie klasy migracji za pośrednictwem konsoli. Nie mogę uzyskać rozpoznawalności kodu migracji.

Jednak, jak wskazują komentarze, preferowane jest uruchamianie migracji w kolejności. Posługiwać się:

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

Skopiować i wkleić kod w migracji do skryptu / konsoli?



0

Używam tej techniki w programowaniu, gdy zmieniam migrację w znacznej ilości i nie chcę migrować w dół tony i tracić żadnych danych po drodze (zwłaszcza gdy importuję starsze dane, co zajmuje dużo czasu, Nie chcę ponownie importować).

To jest w 100% hacking i zdecydowanie nie polecałbym tego na produkcji, ale wystarczy:

  1. Przenieś migrację, którą chcesz ponownie uruchomić, z katalogu do miejsca tymczasowego
  2. Wygeneruj kolejną migrację o tej samej nazwie
  3. Skopiuj / wklej oryginalny kod migracji do nowo wygenerowanego pliku migracji
  4. Uruchom nową migrację
  5. Usuń nowo wygenerowany plik migracji
  6. Edytuj migracje schematu, aby usunąć najnowszą wartość
  7. Przywróć stary plik migracji
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.