Ruby on Rails: Jak mogę cofnąć migrację za pomocą rake db: migrate?


94

Po zainstalowaniu devise MODEL User otrzymałem to.

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

Teraz, jeśli zrobię rake db: migrate, zostanie utworzona tabela użytkowników.

Jak mogę cofnąć tę migrację, tj. Jak ponownie usunąć tabelę użytkowników za pomocą rake?

Odpowiedzi:


147

Uruchom następujące polecenie

rake db:migrate:down VERSION=<version>

gdzie <version>jest numer wersji pliku migracji, który chcesz przywrócić.

na przykład. jeśli chcesz cofnąć migrację o nazwie pliku 3846656238_create_users.rb

rake db: migrate: down WERSJA = 3846656238


Otrzymuję, UnknownMigrationVersionErrorale zorientowałem się, że to dlatego, że moje migracje są w środku db/migrate/main, czy ktoś zna obejście tego, aby db:migrate:downzajrzeć do tego konkretnego katalogu lub podkatalogów migracji?
tf.rz

Dotyczy to tylko szyn od 3. Moje życie
toczy się

@morhook Działa to również dla szyn 3. Sprawdź dokumentację tutaj guide.rubyonrails.org/v3.2/migrations.html
Mahesh

Masz rację! Działa zarówno dla szyn 2, jak i szyn 3. Dzięki @Mahesh za Twój wkład!
morhook


65

Uważam, że istnieją trzy opcje cofania migracji (również się pokrywają):

  1. Wycofaj ostatnią migrację:

    rake db:migrate:down # Tylko szyny 2.

  2. Pokaż liczbę (n) ostatnich migracji:

    rake db:rollback STEP=n

  3. Przejdź do poprzedniej, konkretnej wersji:

    $ rake db:migrate:down VERSION=nnn # Rails 3 (podaj również numer wersji).

Numer wersji oznacza SHA (Secure Hash Algorithm) dla zatwierdzenia, który jest długą liczbą szesnastkową, która wygląda jak 886af3194768917c78e ... Możesz to zobaczyć, wykonując git log

Możesz zobaczyć te polecenia (i inne) z ich opisami, używając rake -T db:których dla rails 3.2 obejmuje:

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)

5
Staczają do wersji szczególnych:rake db:migrate VERSION=<version number>
Ajedi32

3
Przynajmniej dla szyn 3.0.20 pierwsze polecenie jest błędne. Pojedynczy rake db:migrate:downprzerywany z komunikatem o błędzie „VERSION jest wymagana”. Zaleca rake db:rollback jednak działa.
martin

Jak opisano szczegółowo w odpowiedzi, Rails 2 TYLKO dla pierwszego polecenia.
Michael Durrant,

1
Zmienne środowiskowe uwzględniają wielkość liter, więc powinno być STEPiVERSION
Kostas Rousis

W celu wyjaśnienia, $ rake db:migrate:down VERSION=nnnnie stoczyć się do wersji, że wędruje w dół w wersji podanej.
johnml

15

Możesz zrobić wycofanie i określić, ile ostatnich migracji zostanie wycofanych, np

rake db:rollback STEP=3

przez ostatnie 3 migracje.


jest to szybszy i łatwiejszy sposób, zamiast sprawdzania numerów wersji, jeśli chcesz cofnąć kilka ostatnich migracji
Pre-alpha

11

Jako nowy programista (lub dla innych nowych programistów)

rake db:rollbackdziała mniej więcej przez połowę czasu. Tam zaczynam.

Jeśli nie, rake db:migrate:down VERSION=3846656238

podłącz VERSION dla numeru wersji pliku migracji, który chcesz przywrócić.


10
rake db:migrate:redo

Cofnie i ponownie zastosuje ostatnią migrację.


5

Do szyn 5 możemy użyć rails command instead of rake

rails db:migrate:down VERSION=<version>

przykład

rails db: migrate: down WERSJA = 20170330090327


2

Uruchom to polecenie w swoim terminalu:

rake db:migrate:status

lub

bundle exec rake db:migrate:status

Pokazuje status, identyfikator migracji, nazwę migracji dla wszystkich migracji, które przeprowadziliśmy wcześniej. wybierz identyfikator migracji (tj. numer wersji) i umieść ten identyfikator w następującym poleceniu po wersji = ,, i naciśnij klawisz Enter

bundle exec rake db:migrate:down VERSION=

0

Jak przywrócić migrację

(1) Najpierw zidentyfikuj identyfikator migracji

rake db:migrate:status

  • Skopiuj numer identyfikacyjny.

Zidentyfikuj migrację do wycofania.

(2) Następnie wycofaj migrację

rake db:migrate:down VERSION=20190802023239

  • Wklej odpowiedni numer identyfikacyjny powyżej. Oczywiście w Twoim przypadku identyfikator migracji będzie inny! Użyj poprawnego identyfikatora migracji.

....... a teraz ruszasz na wyścigi!

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.