25

Sono stato il passaggio tra i rami di un progetto e ognuno di loro hanno diverse migrazioni ... questo è lo scenario:Qual è il modo migliore per risolvere le migrazioni orfane di Rails?

$ rake db: migrate: Stato

Status Migration ID Migration Name 
-------------------------------------------------- 
    ... 
    up  20130307154128 Change columns in traffic capture 
    up  20130311155109 Remove log settings 
    up  20130311160901 Remove log alarm table 
    up  20130320144219 ********** NO FILE ********** 
    up  20130320161939 ********** NO FILE ********** 
    up  20130320184628 ********** NO FILE ********** 
    up  20130322004817 Add replicate to root settings 
    up  20130403190042 ********** NO FILE ********** 
    up  20130403195300 ********** NO FILE ********** 
    up  20130403214000 ********** NO FILE ********** 
    up  20130405164752 Fix ap hostnames 
    up  20130410194222 ********** NO FILE ********** 

Il problema è rake db:rollback non funziona affatto a causa dei file mancanti ...

Cosa devo fare per poter eseguire nuovamente il rollback e sbarazzarsi dei messaggi NO FILE?

Btw, rake db:reset o rake db:drop non sono un'opzione, non posso perdere i dati da altre tabelle ...

risposta

40

ho finito per risolvere il problema in questo modo:

(1) Vai ai rami che ha i file di migrazione e di rollback. Questo non è banale quando si hanno molti rami che provocheranno molti conflitti se si tenta di unirli. Quindi uso questi comandi per scoprire che i rami di ogni migrazione orfana appartengono a.

Quindi, ho bisogno di trovare commit dell'ultima volta che la migrazione è stata modificata.

git log --all --reverse --stat | grep <LASTEST_ORPHAN_MIGRATION_ID> -C 10 

prendo l'hash commettere e determinare quale ramo appartiene in questo modo:

git branch --contains <COMMIT_HASH> 

poi posso tornare a quel ramo, fare un rollback e ripetere la procedura per tutti i file mancanti.

(2) Esegui migrazioni: controlla il ramo su cui desideri lavorare e esegui le migrazioni e dovresti essere pronto.

Risoluzione dei problemi

Inoltre ho fatto funzionare in alcuni casi in cui le migrazioni orfani dove sui rami eliminati.

Per risolvere questo problema ho creato file di migrazione fittizi con lo stesso migration_id dei file mancanti e li ho rilasciati. Dopo di che, sono stato in grado di eliminare essi manichino migrazioni e hanno uno status di migrazione pulita :)

Un'altra alternativa è l'eliminazione dei file mancanti dal database direttamente:

delete from schema_migrations where version='<MIGRATION_ID>'; 
+6

ottima risposta. Dacci il modo più semplice, più breve, pratico prima non ultimo! =] Mi stavo stressando fino a quando, oh. Goody. – ahnbizcad

+6

Dove lo scrivi? 'eliminare dalla schema_migrations dove version = '';' – ahnbizcad

+10

nella console database ... è possibile accedervi digitando: 'rotaie dbconsole' – Adrian

0

Supponendo che si sta utilizzando Git, dovrebbe essere relativamente semplice da afferrare queste migrazioni e portarli nella vostra corrente ramo. Se si dispone di una specifica commettere si desidera un file da, è possibile utilizzare:

git checkout <commit hash> <file_name> 

(Grazie a this answer)

In alternativa, è possibile controllare da uno specifico TESTA ramo:

git checkout <branch name> -- <file_name> 

In base a questo blog post

Supponendo che queste siano, di fatto, le versioni delle migrazioni eseguite nel database, si dovrebbe essere buoni o rollback.

+0

grazie per la risposta. Il problema con questo è che sto lavorando in un grande progetto con un sacco di filiali e sviluppatori. Quindi, non so quale ramo abbia la migrazione orfana. Ho finalmente trovato la via (vedi la mia risposta) – Adrian

0

È possibile unire nuovamente i due rami nel master in modo da rendere disponibili tutte le migrazioni. Se davvero non si desidera eseguire tali migrazioni, ma si desidera poter eseguire il rollback, è possibile modificare la tabella schema_migrations nel database per rimuovere le righe corrispondenti alle migrazioni per le quali non si dispone di file. Tuttavia, ciò causerà problemi se si passa a un altro ramo con migrazioni diverse.

+0

È una buona idea unire i rami temporanei e il rollback fino a raggiungere uno stato buono. Tuttavia, alcuni dei rami non hanno commesso un antenato vicino, quindi avranno un sacco di conflitti durante la fusione ... Ho risolto il problema andando in ognuna delle filiali che contengono le migrazioni orfane e poi torno di nuovo al mio ramo. .. – Adrian

14

Edit: Come ha detto nei commenti, il seguente scenderà il database

Un approccio più semplice che ha funzionato per me (si noti che questo comando eliminare il database e tutti i dati saranno persi):

rake db:migrate:reset

..e poi:

rake db:migrate:status

L'orfano (s) dovrebbe sparire.

+1

Ciò ha risolto il mio problema orfano – Livi17

+14

** ATTENZIONE: db: migrate: reset farà cadere il database, con conseguente perdita di dati completa !! ** – Phil

+1

LEGGERE IL MESSAGGIO SOPRA QUESTO - Non reimpostare il database in quanto perderete tutti i vostri dati. –

12

Le migrazioni vengono memorizzate nel database. Se si desidera rimuovere le migrazioni abbandonate, rimuoverle dal db.

Esempio per Postgres:

  1. Aperto psql:

    psql 
    
  2. Collegamento al db:

    \c your_database 
    
  3. Se siete curiosi, schema_migrations display:

    SELECT * FROM schema_migrations; 
    
  4. Se siete curiosi, verificare se le migrazioni abbandonati sono presenti:

    SELECT version FROM schema_migrations WHERE version IN 
    ('20130320144219', '20130320161939', '20130320184628', '20130403190042', 
    '20130403195300', '20130403214000', '20130410194222'); 
    
  5. eliminarli:

    DELETE FROM schema_migrations WHERE version IN (<version list as above>); 
    

Ora, se si esegue bundle exec rake db:migrate:status, ti vedere le migrazioni orfane sono state rimosse con successo.

+1

Questa dovrebbe essere la risposta accettata – moveson

+0

Grazie, questo è fantastico, e non ha rovinato i miei dati di allestimento. –

0

Se i file di migrazione sono veramente mancano (ad esempio corse migrazione, dimenticato di ripristinare la migrazione, quindi eliminato file di migrazione prima di commettere), sono stato in grado di riprodurre la migrazione mancante come segue:

  1. tornare indietro nel git history per ottenere una copia del file schema.rb e salvare al di fuori di git repo (git log; git checkout xxxxxx; cp schema.rb ~/schema_old.rb, git checkout master).
  2. eseguire un diff su due file, e copiare i comandi di migrazione in un file di migrazione che corrisponde al ID di migrazione mancante (diff schema.rb ~/schema_old.rb > migration_file.rb; vi migration_file.rb)
  3. controllare lo stato della migrazione e rollback (rake db:migrate:status; rake db:rollback; rake db:migrate:status;)
Problemi correlati