Ruby on Rails: come posso ripristinare una migrazione con rake db: migrate?


94

Dopo aver installato devise MODEL User ho ottenuto questo.

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

Ora se eseguo rake db: migrate verrà creata la tabella degli utenti.

Come posso annullare questa migrazione, ovvero come posso eliminare la tabella degli utenti utilizzando nuovamente il rake?

Risposte:


147

Esegui il seguente comando

rake db:migrate:down VERSION=<version>

dove <version> trova il numero di versione del file di migrazione che desideri ripristinare.

per esempio. se si desidera annullare una migrazione con il nome file 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238


Sto ricevendo un UnknownMigrationVersionErrorma ho capito che è perché le mie migrazioni sono dentro db/migrate/main, qualcuno conosce una soluzione alternativa per questo per db:migrate:downdare un'occhiata all'interno di quella directory specifica o nelle sottodirectory di migrazione?
tf.rz

Questo è solo per i binari 3 in poi. La mia vita è in rotaia 2. Così triste
morhook

@ morhook Funziona anche per i binari 3. Controlla i documenti qui guides.rubyonrails.org/v3.2/migrations.html
Mahesh

Hai ragione! Funziona sia per binari 2 che per binari 3. Grazie @Mahesh per il tuo contributo!
morhook


65

Credo che ci siano tre opzioni disponibili per annullare le migrazioni (si sovrappongono anche):

  1. Eseguire il roll down della migrazione più recente :

    rake db:migrate:down # Solo rotaie 2.

  2. Arrotolare un numero (n) di migrazioni recenti:

    rake db:rollback STEP=n

  3. Passa a una versione precedente e specifica :

    $ rake db:migrate:down VERSION=nnn # Rails 3 (fornire anche il numero di versione).

Numero di versione indica SHA (Secure Hash Algorithm) per il commit che è un lungo numero esadecimale che assomiglia a qualcosa come 886af3194768917c78e ... Puoi vederlo facendo git log

Puoi vedere questi comandi (e altri) con le loro descrizioni usando rake -T db:che per rails 3.2 include:

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
Rotolare giù per una versione specifica:rake db:migrate VERSION=<version number>
Ajedi32

3
Almeno per rails 3.0.20, il primo comando è sbagliato. Un singolo si rake db:migrate:downinterrompe con il messaggio di errore "VERSION is required". Il consigliato rake db:rollback tuttavia funziona.
martin

Come dettagliato nella risposta, Rails 2 SOLO per il primo comando.
Michael Durrant

1
Le variabili di ambiente fanno distinzione tra maiuscole e minuscole, quindi dovrebbe essere STEPeVERSION
Kostas Rousis

Per chiarire, $ rake db:migrate:down VERSION=nnnnon passa a una versione, migra verso il basso la versione specificata.
johnml

15

Puoi eseguire il rollback e specificare quante ultime migrazioni verranno ripristinate, ad es

rake db:rollback STEP=3

per le ultime 3 migrazioni.


questo è un modo più semplice e veloce, invece di cercare i numeri di versione se vuoi annullare le ultime migrazioni
Pre-alpha

11

Come nuovo programmatore (o ad altri nuovi programmatori)

rake db:rollbackfunziona circa la metà del tempo. Comincio da lì.

Altrimenti, rake db:migrate:down VERSION=3846656238

collega VERSION per il numero di versione del file di migrazione che desideri ripristinare.


10
rake db:migrate:redo

Annullerà e riapplicherà l'ultima migrazione.


5

Per i binari 5 possiamo usare rails command instead of rake

rails db:migrate:down VERSION=<version>

esempio

rails db: migrate: down VERSION = 20170330090327


2

Esegui questo comando nel tuo terminale:

rake db:migrate:status

o

bundle exec rake db:migrate:status

Mostra lo stato, l'ID della migrazione, il nome della migrazione per tutte le migrazioni eseguite in precedenza. seleziona il tuo ID di migrazione (cioè il tuo numero di versione) e inserisci quell'ID nel seguente comando dopo version = ,, e premi Invio

bundle exec rake db:migrate:down VERSION=

0

Come ripristinare una migrazione

(1) Prima identificare l'ID di migrazione

rake db:migrate:status

  • Copia il numero ID.

Identifica la migrazione da ripristinare.

(2) Quindi ripristinare la migrazione

rake db:migrate:down VERSION=20190802023239

  • Incolla il numero ID pertinente sopra. Ovviamente, nel tuo caso, l'ID di migrazione sarà diverso! Utilizza l'ID di migrazione corretto.

....... e adesso sei pronto per le gare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.