2009-06-17 15 views
20

Does rake db: migrate solo aggiungere nuove migrazioni, o elimina tutte le migrazioni/modifiche e crea tutto nuovo?esattamente cosa fa rake db: migrate do?

Penso che il rake stia generando un errore perché sta tentando di accedere a un attributo di tabella nella migrazione 040 che è stato eliminato nella migrazione 042. in qualche modo il mio DB e il rake sono fuori sincrono e voglio correggerli.

per voi esperti là fuori - è normale che il rake non si sincronizzi con le migrazioni? come posso evitare questo (no, non modifico a mano il mio schema o rake file).

risposta

14

Ogni volta che si crea una migrazione utilizzando script (come script/genera modello ...) una nuova migrazione viene aggiunta alla directory corretta pronta per essere sincronizzata con il database reale.

In realtà rake db: migrare solo i controlli su quali migrazioni mancanti devono ancora essere applicate al database senza preoccuparsi di quelle precedenti.

Ovviamente se si modifica il database utilizzando altri metodi è comune ottenere elementi non sincronizzati perché, come hai detto, puoi trovarti ad applicare una migrazione a qualcosa che viene modificato in basso.

21

Quando si utilizzano le migrazioni di rotaie, viene creata automaticamente una tabella denominata schema_migrations, che tiene traccia di quali migrazioni sono state applicate, memorizzando il numero di versione di ciascuna migrazione (questo è il numero che precede il nome della migrazione nel nome file , ovvero db/migrate/_20090617111204__migration.rb). Quando esegui rake db:migrate per eseguire la migrazione, verranno eseguite solo le migrazioni che non sono state eseguite in precedenza (ovvero la loro versione non è contenuta nella tabella) (per questo motivo, la modifica di una migrazione già eseguita non avrà alcun effetto durante l'esecuzione di db:migrate). Durante la migrazione verso il basso, tutte le versioni trovate in schema_migrations che sono maggiori della versione a cui si sta eseguendo il rollback verranno annullate.

+2

Grazie a Dio questa risposta ha definito più specifiche per me. Perché non c'è schema_migrations in nessun punto del db: migrazione della documentazione? Era il pezzo mancante alla mia comprensione del sistema riguardo a come le rotaie "capiscono quali migrazioni devono essere eseguite"! –

5

Una migrazione significa che si passa dalla versione corrente a una versione più recente (come si dice nella prima risposta). Utilizzando rake db: migrate è possibile applicare qualsiasi nuova modifica allo schema. Tuttavia, se si desidera eseguire il rollback a una migrazione precedente, è possibile utilizzare rake db: rollback per annullare le nuove modifiche se vengono definite in modo errato. Attenzione: così facendo i tuoi dati andranno persi.

Problemi correlati