Come ripristinare una migrazione specifica?


808

Ho il seguente file di migrazione db\migrate\20100905201547_create_blocks.rb

Come posso eseguire il rollback specifico di quel file di migrazione?


1
Questo risolve il problema? Avrete solo bisogno di fare Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
Tutte le informazioni sulle migrazioni Qui
Nishutosh Sharma,

1
Vuoi ripristinare solo quella singola migrazione specifica (anche se ci sono migrazioni più recenti che ne conseguono)? Oppure vuoi ripristinare il database allo stato in cui si trovava prima della migrazione e delle successive migrazioni applicate?
Jon Schneider,

Risposte:


1342
rake db:rollback STEP=1

È un modo per farlo, se la migrazione che si desidera ripristinare è l'ultima applicata. È possibile sostituire 1 per quante migrazioni si desidera tornare indietro.

Per esempio:

rake db:rollback STEP=5

Verrà inoltre eseguito il rollback di tutta la migrazione avvenuta in seguito (4, 3, 2 e anche 1).

Per ripristinare tutte le migrazioni su (e inclusa) una migrazione di destinazione, utilizzare: (Questo comando corretto è stato aggiunto DOPO tutti i commenti che evidenziano l'errore nel post originale)

rake db:migrate VERSION=20100905201547

Per eseguire il rollback SOLO DI UNA migrazione specifica (FUORI ORDINE) utilizzare:

rake db:migrate:down VERSION=20100905201547

Si noti che questo NON eseguirà il rollback di eventuali migrazioni intercessionate, ma solo quella elencata. Se non è quello che volevi, puoi correre in sicurezza rake db:migratee rieseguirà solo quello, saltando tutti gli altri che non sono stati precedentemente ripristinati.

E se vuoi mai migrare una singola migrazione fuori servizio, c'è anche il suo contrario db:migrate:up:

rake db:migrate:up VERSION=20100905201547

14
"Per eseguire il rollback a una versione specifica" - il comando che segue esegue solo il rollback di una migrazione specifica, anziché eseguire il rollback a quella versione?
Andrew Grimm,

10
"Per ripristinare la versione specifica utilizzare ..." Questa risposta non è corretta! Questo eseguirà il rollback della migrazione in modo isolato, come spiegato da altre risposte.
Rhys van der Waerden,

3
ATTENZIONE: ho fatto questo errore: usa solo rake db: migrate: down VERSIONE = 20100905201547 per eseguire il rollback IN ISOLAMENTO !!! un file di migrazione. Questo è menzionato nel commento sopra, ma l'ho perso.
pixelearth,

3
Un'altra parola di avvertimento: non farlo mai STEP=-1. L'ho fatto una volta ed è impazzito, riportando tutto indietro. Non bello! Questo era Rails 4.2 - Immagino che possa essere risolto ormai.
Dave Hartnoll,

1
Nel mio blog ho scritto un articolo sulle migrazioni, che spiega come e quando usare questi comandi: railsguides.net/polish-rails-migrations
ka8725

868
rake db:migrate:down VERSION=20100905201547

eseguirà il rollback del file specifico.


Per trovare la versione di tutte le migrazioni, puoi usare questo comando:

rake db:migrate:status

Oppure, semplicemente il prefisso del nome file della migrazione è la versione che è necessario eseguire il rollback.


Vedi la voce della guida di Ruby on Rails sulle migrazioni.


48
Sicuramente la risposta preferita secondo me.
streetlogics,

30
Vale la pena ricordare che se si esegue il rollback di una migrazione specifica e non si desidera che esegua nuovamente la migrazione sulle attività di rake imminenti, eliminare anche il file di migrazione.
BradGreens,

4
Nota: sembra che se la migrazione verso l'alto non è mai riuscita ma è stata eseguita solo parzialmente, la discesa non fa nulla.
cyrilchampier,

1
@nerith, probabilmente è vero solo per i database che non supportano il DDL transazionale. MySQL non supporta il DDL transazionale: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL fa: wiki.postgresql.org/wiki/… Quindi se la tua migrazione sul database MySQL è interrotta quindi è necessario eliminare manualmente parte della migrazione riuscita.
Иван Бишевац

1
Un'altra osservazione riguardante il commento di @BradGreens. Se si desidera rimuovere il file di migrazione ed è già stato distribuito, è necessario ripristinare la produzione / stadiazione prima di eseguire il commit del codice con il file rimosso. Altrimenti non sarai in grado di eseguire il rollback / migrazione: verso il basso.
AdamT

57

Per ripristinare l'ultima migrazione è possibile eseguire:

rake db:rollback

Se si desidera eseguire il rollback di una migrazione specifica con una versione, è necessario:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Ad esempio, se la versione è 20141201122027, farai:

rake db:migrate:down VERSION=20141201122027

per ripristinare quella specifica migrazione.


32

È possibile eseguire il rollback della migrazione utilizzando rake db:rollbackcon diverse opzioni. La sintassi sarà diversa in base alle proprie esigenze.

Se desideri eseguire il rollback solo dell'ultima migrazione, puoi utilizzare entrambi

rake db:rollback

o

rake db:rollback STEP=1

Se si desidera eseguire il rollback del numero di migrazioni contemporaneamente, è sufficiente passare un argomento:

rake db:rollback STEP=n

dove si ntrova il numero di migrazioni da ripristinare, contando dall'ultima migrazione.

Se si desidera eseguire il rollback a una migrazione specifica, è necessario passare la versione della migrazione nel modo seguente:

rake db:migrate:down VERSION=xxxxx

dove xxxxx è il numero di versione della migrazione.


1
aggiungendo: down non funziona però, la risposta corretta è senza down
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

La versione è il prefisso numerico sul nome del file della migrazione

Come trovare la versione :

I tuoi file di migrazione sono memorizzati nella tua rails_root/db/migratedirectory. Trova il file appropriato su cui desideri eseguire il rollback e copia il numero di prefisso.

per esempio

nome file: 20140208031131_create_roles.rb quindi la versione è20140208031131


6
Il modo più semplice per trovare l'id di migrazione è eseguirerake db:migrate:status
Aeradriel,

18

Rollback dell'ultima migrazione:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

Rollback dell'ultimo nnumero di migrazioni

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

Rollback di una migrazione specifica

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

Per ripristinare l'ultima migrazione è possibile eseguire:

rake db:rollback

Se si desidera eseguire il rollback di una migrazione specifica con una versione, è necessario:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Se il file di migrazione che si desidera ripristinare è stato chiamato db/migrate/20141201122027_create_some_table.rb, allora la VERSIONE per quella migrazione è 20141201122027, che è il timestamp di quando è stata creata quella migrazione e il comando per ripristinare quella migrazione sarebbe:

rake db:migrate:down VERSION=20141201122027

6

Se si tratta di una migrazione reversibile e l'ultima che è stata eseguita, eseguire rake db:rollback. E puoi sempre usare la versione. per esempio

il file di migrazione è 20140716084539_create_customer_stats.rb, quindi il comando di rollback sarà, rake db:migrate:down VERSION=20140716084539


6

Per ripristinare tutte le migrazioni fino a una versione particolare (ad es. 20181002222222), Utilizzare:

rake db:migrate VERSION=20181002222222

(Nota che questo usa db:migrate- non db:migrate:downcome in altre risposte a questa domanda.)

Supponendo che la versione di migrazione specificata sia precedente alla versione corrente, verrà eseguito il rollback di tutte le migrazioni fino alla versione specificata, esclusa.

Ad esempio, se rake db:migrate:statusinizialmente viene visualizzato:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

In esecuzione:

rake db:migrate VERSION=20181002222222

Si tradurrà in:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

Riferimento: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

Dalla guida di Rails

Ripristino delle migrazioni precedenti

È possibile utilizzare la capacità di Active Record per eseguire il rollback delle migrazioni utilizzando il revertmetodo:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

Il revertmetodo accetta anche un blocco di istruzioni per invertire. Ciò potrebbe essere utile per ripristinare parti selezionate delle migrazioni precedenti. Ad esempio, immaginiamo che CreateBlock sia sottoposto a commit e che in seguito venga deciso che sarebbe meglio usare le convalide Record attivo, al posto del vincolo CHECK, per verificare il codice postale.

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

La stessa migrazione avrebbe potuto anche essere scritta senza usare il ripristino, ma ciò avrebbe comportato alcuni passaggi: invertire l'ordine di create_table e reversible, sostituire create_table con drop_table e infine sostituire up con down e viceversa. Tutto questo è curato da Ripristino.


3

Le migrazioni cambiano lo stato del database usando il comando

$ bundle exec rake db:migrate

È possibile annullare un singolo passaggio di migrazione utilizzando

  $ bundle exec rake db:rollback

Per tornare all'inizio, possiamo usare

  $ bundle exec rake db:migrate VERSION=0

Come si può immaginare, la sostituzione di qualsiasi altro numero con 0 migra a quel numero di versione, da dove provengono i numeri di versione elencando le migrazioni in sequenza


2

Bene in rails 5 è abbastanza semplice rake db: migrate: status o rails db: migrate: status

È stato modificato per gestire entrambi allo stesso modo Quindi basta selezionare la versione che si desidera ripristinare e quindi eseguire rake db: migrate VERSION = 2013424230423

Assicurarsi che la VERSIONE sia tutta in maiuscolo

Se hai un problema con qualsiasi passaggio della migrazione o bloccato nel mezzo, vai semplicemente al file di migrazione e commenta le righe già migrate.

spero che aiuti


1
Metto in evidenza il suggerimento per il comando rake db: migrate: status . . . È utile per una panoramica vedere lo stato di esecuzione corrente dei file di migrazione.
Beauty

1

Se si desidera eseguire il rollback e la migrazione è possibile eseguire:

rake db:migrate:redo

È lo stesso di:

rake db:rollback
rake db:migrate
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.