2013-05-08 9 views
12

Attualmente sto lavorando con un'applicazione di rotaie enorme e più rami con ciascuna una nuova funzionalità per questa applicazione. Succede molto che una funzionalità richiederà migrazioni, il che non dovrebbe essere un problema finché non lo si fonde con master: schema.rb è stato aggiornato con le informazioni del proprio database di sviluppo!schema.rb incasinato a causa di migrazioni in altri rami

per chiarire:

1. Branch A has migration create_table_x 
2. Branch B has migration create_table_y 
3. Branch A adds another create_table_z and runs db:migrate 
4. You want to merge Branch A with Master and you see table_x, table_y and table_z in the schema.rb of Branch A. 

Non è un'opzione per ripristinare + seminare il database prima di ogni migrazione in un ramo o di creare un database per ogni ramo. A causa dell'enorme dimensione dei dati SQL da 2 GB, non sarebbe fattibile.

La mia domanda:

E 'davvero necessario per mantenere schema.rb nel repository dal momento che viene ricostruito ogni migrazione?

In tal caso, è possibile creare uno schema fuori dalle migrazioni anziché dal dump del database?

+0

Penso che dovresti conservare lo schema.rb nel tuo repository. Potrebbe succedere che qualcuno pulisca i file di migrazione ed elimini alcune migrazioni inutilizzate dal passato..e se non si dispone di uno schema.rb uniforme, potrei finire in un pasticcio. il file dello schema viene aggiornato ad ogni migrazione, non completamente ricostruito. ma comunque una domanda interessante. – Mattherick

+0

sì, il problema è che si sta generando la struttura attuale del database, indipendentemente dal fatto che le tabelle nel database siano state aggiunte nel parent o nel ramo in cui ci si trova. Ecco cosa intendevo con "ricostruito". Spero che qualcuno conosca un modo più carino di copiare/copiare il database dal master ogni volta che si cambia ramo con le migrazioni :) – Vikko

+0

Possibile duplicato di [Qual è il modo preferito per gestire schema.rb in git?] (Http: // stackoverflow .com/questions/737854/what-is-the-preferred-way-to-manage-schema-rb-in-git) – Tachyons

risposta

9

si dovrebbe mantenere lo schema all'interno del repository. l'esecuzione della migrazione risolverà i conflitti di unione all'interno del file schema.rb. la mia semplice risposta alle tue domande

  1. È necessario? non proprio, ma buone pratiche.

"E 'fortemente raccomandato di controllare questo file nel vostro sistema di controllo versione ." -schema.rb

  1. E 'possibile? Sì, ma potresti chiederti se davvero risparmi in qualsiasi momento, manualmente o costruendo lo schema dalle tue migrazioni altrove e spingendolo dentro.

si ge lLa vantaggio di utilizzare

rake db:schema:load 

e

rake db:schema:dump 

http://tbaggery.com/2010/10/24/reduce-your-rails-schema-conflicts.html

2

Mantenere schema.rb nel repository è importante, perché si desidera che un nuovo sviluppatore (o l'ambiente di test) sia in grado di generare un nuovo database solo da schema.rb. Quando si eseguono molte migrazioni, è possibile che non tutte continuino a essere eseguite, soprattutto se si basano su classi di modelli che non esistono o sono state modificate o che hanno validità diverse rispetto a quando è stata eseguita la prima migrazione. Quando si eseguono i test, si desidera scaricare e ricreare il database da schema.rb, non eseguendo nuovamente tutte le migrazioni ogni volta che si esegue la suite di test completa.

Se si stanno lavorando contemporaneamente su due diverse feature branch e si modifica la struttura del database in entrambi, penso che schema.rb sia l'ultimo dei problemi. Se rinomini o rimuovi una colonna nel ramo B, il ramo A si interromperà ogni volta che fa riferimento alla vecchia colonna. Se tutto ciò che stanno facendo è creare nuove tabelle, non è così male, ma poi tu vuoi che lo schema.rb sia aggiornato quando ti unisci dal master in A, così che A non prova ad eseguire la migrazione una seconda volta e falliscono perché la nuova tabella esiste già.

Se questo non risponde alla tua domanda, potresti spiegare un po 'di più il tuo flusso di lavoro?

+0

Questo è corretto, ma non vuoi le tabelle del ramo B (dove hai eseguito il migrazioni) appaiono nel master PRIMA di unire il ramo B. Ad esempio: Se esiste una tabella che viene utilizzata sia nel ramo A che nel ramo B, ** il ramo B cambia nome in cognome_ **, ** il ramo A cambia le iniziali in nome di battesimo**. Unisci il ramo A, non unisci il ramo B perché ha alcune complicazioni => lo ** schema generato contiene first_name e last_name **, mentre preferisci avere ** first_name e name **. Alcune logiche potrebbero essere utili per verificare la presenza di migrazioni non nel master e ripristinarle nello schema.rb – Vikko

+0

Questo suona bene all'inizio, ma alcune migrazioni potrebbero non essere così reversibili. Probabilmente puoi farlo manualmente tramite: rake db: migrate VERSION = 123 dove 123 è il numero di migrazione nello schema.rb. Questo dovrebbe migrare in avanti o indietro come necessario per arrivare a quella versione. In definitiva, la tua migliore scommessa sarà quella di ottenere almeno le migrazioni da ciascun ramo unite in master nel più breve tempo possibile, anche se devi farlo selezionando cherry-picking. – sockmonk

+1

Ne sono consapevole, ma il problema sta lavorando con circa 20 filiali che hanno tutte una durata tra poche ore e pochi mesi .. Ecco dove arrivano le complicazioni: dimentichi che il ramo ha avuto migrazioni e sei fottuto ! Oltre a ciò, le migrazioni su un grande tavolo (oltre 100.000 record) richiedono anni. Preferiresti lasciarli lì per lo sviluppo e aggiornare solo lo schema se la tabella non è usata nel tuo attuale ramo. – Vikko

1

fresco Temporary DB come una rapida soluzione

Ad esempio, effettuare le seguenti operazioni ogni volta che si bisogno di abbastanza db/schema.rb sul ramo particolare:

  1. git checkout - db/schema.rb
  2. interruttore al diverso database di sviluppo, vale a dire l'aggiornamento config/database.yml
  3. rake db: Goccia & & rake db : impostazione
  4. rake db: migrate
  5. commettere il tuo bel db/schema.rb
  6. annullare le modifiche in config/database.yaml