Come eliminare i file di migrazione in Rails 3


109

Vorrei rimuovere / eliminare un file di migrazione. Come potrei farlo? So che ci sono domande simili qui, ma come aggiornamento, esiste un modo migliore che eseguire script / distruggi?

Inoltre, devo fare db:reseto db:dropse rimuovo / elimino una migrazione?

Risposte:


142

Io di solito:

  1. Eseguire una rake db:migrate VERSION=XXXsu tutti gli ambienti, alla versione precedente a quella che voglio eliminare.
  2. Elimina manualmente il file di migrazione.
  3. Se ci sono migrazioni in sospeso (cioè, la migrazione che ho rimosso non era l'ultima), ne eseguo una nuova rake db:migrate.

Se l'applicazione è già in produzione o in fase di staging, è più sicuro scrivere semplicemente un'altra migrazione che distrugge la tabella o le colonne.

Un altro ottimo riferimento per le migrazioni è: http://guides.rubyonrails.org/migrations.html


2
Eliminare la migrazione e quindi eseguire un db: migrate cancellerebbe la tabella che è stata creata?
alvincrespo

2
No, poiché Rails non saprebbe come eliminarlo. Deve chiamare il self.downmetodo definito nella migrazione per eseguire il "downgrade" del database.
Fábio Batista

35
Se hai già cancellato il file, senza rendertene conto, rails non ti lascerà andare così facilmente, rake db:migrate:statusti mostrerà l'ID del file mancante, che potrai usare per ricrearlo. Una volta tornato, puoi seguire il consiglio di questa risposta per la vittoria.
Jordan Feldstein

1
@JordanFeldstein, grazie. db:migrate:statusè un salvavita!
dee

1
@ Lucas, una volta rimosso il file di migrazione, non può più essere annullato. Ecco perché è necessario ripristinarlo su tutti gli ambienti già eseguiti (produzione, sviluppo, test, gestione temporanea, ecc.) Prima di eliminare il file. Questo è anche il motivo per cui ho scritto che è più sicuro creare un'altra migrazione per ripristinare quella vecchia, una volta che è già stata eseguita in produzione.
Fábio Batista

68

Un altro modo per eliminare la migrazione:

$ rails d migration SameMigrationNameAsUsedToGenerate

Usalo prima che rake db:migratevenga eseguito perché le modifiche nel database rimarranno per sempre :) - o rimuovi le modifiche manualmente


3
"Se la tua applicazione è già in produzione o in fase di staging, è più sicuro scrivere semplicemente un'altra migrazione che distrugge la tabella o le colonne." Quindi le modifiche non rimangono nel database per sempre
JohnMerlino

8
A proposito, "d" sta per "distruggi".
Greg M. Krsak

21

Esegui i seguenti comandi dalla home directory dell'app:

  1. rake db:migrate:down VERSION="20140311142212" (qui la versione è il timestamp anteposto da rails quando è stata creata la migrazione. Questa azione annullerà le modifiche al DB dovute a questa migrazione)

  2. Run "rails destroy migration migration_name"(nome_migrazione è quello scelto durante la creazione della migrazione. Rimuovi " timestamp_ " dal nome del file di migrazione per ottenerlo)


rake destroy migration AddFileToTable rake aborted! Non so come creare l'attività 'distruggere' (vedere la traccia completa eseguendo l'attività con --trace)
sadaf2605

3
Per # 2 il comando corretto è:rails d migration migration_name
mauriciomdea

1
Grazie per il suggerimento "rimuovi timestamp_" che è ciò di cui avevo bisogno
LightMan

10

Puoi anche eseguire una migrazione verso il basso in questo modo:

rake db:migrate:down VERSION=versionnumber

Fare riferimento alla guida Ruby on Rails sulle migrazioni per maggiori informazioni.


9

Possiamo usare,

$ rails d migration table_name  

Che eliminerà la migrazione.


1
Penso che dovrebbe essere il nome del modello piuttosto che table_name
Ajeet Khan il

3

A volte mi sono ritrovato a cancellare il file di migrazione e quindi a eliminare la voce corrispondente nella tabella schema_migrations dal database. Non è carino ma funziona.


3

Funziona anche in Rails 5.

Se la migrazione è stata la più recente, è possibile rimuovere le colonne del database che la migrazione ha aggiunto facendo:

rake db:rollback

quindi rimuovere il file di migrazione stesso eseguendo:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Nessuna di queste risposte si adattava perfettamente al problema che avevo poiché mancava la migrazione che volevo eliminare: avevo creato ed eseguito una migrazione in qualche altro ramo, che è stata poi scartata. Il problema è che quando viene eseguita una migrazione, rails aggiunge la versione in una schema_migrationstabella nel database. Quindi, anche se non è elencato nella struttura o nello schema del database, rails lo cerca. Puoi rivelare queste migrazioni orfane eseguendo:

rails db:migrate:status

Prendi nota delle versioni delle migrazioni mancanti e accedi alla console del database:

rails dbconsole

Ora rimuovi manualmente le versioni dalla tabella di migrazione:

delete from schema_migrations where version='<version>';

Ora dovresti essere bravo.


0

Ho appena avuto lo stesso problema:

  1. rails d migrazione fuu cancellato la migrazione con l'ultimo timestamp
  2. rails d migration fuu -questo ha eliminato l'altra migrazione
  3. usa git status per verificare che non sia più sui file non tracciati
  4. rotaie g migrazione fuu

Questo ha risolto il problema per me


0

Nota a margine: a partire da rails 5.0.0 rakeè stato modificato in rails Quindi eseguire quanto segue

rails db: migrate VERSION = 0

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.