8

So che la migrazione è un modo per eseguire il controllo della versione sullo schema del database. Tuttavia, poiché ho un database condiviso da più progetti e ogni progetto può modificare un po 'lo schema. Quindi, avrei bisogno di qualcosa come branch e merge function come git per i codici, in cui la migrazione non può dare tale funzione. Quindi, esiste uno strumento di controllo della versione specifico per il database?Come eseguire il controllo della versione del database senza migrazione di un framework specifico?

Stiamo usando php con laravel e mysql per il database e siamo disposti a passare a postgresql se necessario.

+0

Si consiglia di scegliere un controllo del codice sorgente che verrà incorporato nella distribuzione (ovvero, generare lo script di distribuzione) e sarà anche in grado di farlo in base all'attività dal sistema di gestione delle attività – Uri

risposta

2

dbv.php è un'applicazione di controllo della versione del database che è possibile utilizzare. Here è un articolo di Sitepoint su come usarlo.

+0

Se si è in grado di dare una guida facile, preferirei scegliere questa risposta per la taglia. Dalla descrizione della funzione nel link, sembra che questo sia quello che voglio, ma non ho il tempo di provare ancora, quindi qualche altra descrizione mi aiuterà a giudicare se valga la pena di una taglia. Inoltre, è difficile convincere la gente che una risposta con soli collegamenti merita una ricompensa. – cytsunny

+0

@ user1273587 Mi piacerebbe scrivere una guida, ma non ho esperienza con la soluzione e dato che la guida che ho linkato è così ben scritta, la mia risposta sarebbe solo una riscrittura di quell'articolo. Non penso che ci sia molto di più che posso fare. Speriamo che qualcun altro arriverà ed espanderà la risposta. – OskarD90

7

È possibile impostare tutti i file di configurazione .sql all'interno del repository git per il progetto. Perché lei ha citato molti progetti di utilizzare questa base di dati, potrebbe essere saggio di utilizzare un unico repository esclusivamente per il database:

Si consideri che la directory seguente è gestito da git:

setup.php 
setup/ 
----- Create_database.sql 
----- Create_users_table.sql 
----- Create_posts_table.sql 
----- Create_some_view.sql 

setup.php possono ora essere utilizzato per eseguire tutti i file .sql all'interno della directory di installazione per semplificare l'implementazione/la clonazione del database. Quando è necessario apportare modifiche al database, è sufficiente utilizzare le funzionalità già incorporate in git to branch e unire le modifiche in questo repository.

+1

Come gestisci l'aggiunta di colonne o cancella colonna? Sarebbe difficile trascinare la tabella e creare nuovamente ogni volta che è necessario aggiungere una colonna o eliminare una colonna. – cytsunny

+0

@ user1273587, non vedo necessariamente come sarebbe doloroso se non tenterai di replicare tutti i dati che sono stati memorizzati nel database (in questo caso, potresti aggiungere un file 'insert_data.sql'). Lo scopo di questo è di essere in grado di creare il database da zero su una nuova macchina o tornare a uno schema precedente. Modificherei 'Create_tables.sql' per il primo ed emetterò un'istruzione' ALTER' per i database esistenti. – HPierce

2

Come accennato sopra c'è un sacco di strumenti aziendali. Personalmente sono andato a creare il mio. Io uso un dbdeploy api.

Funziona: scrivere i vostri script incrementali 1_c_table_t.sql 2_c_uk_index_t.sql ... Si richiede una tabella nel database in cui memorizza tutti i numeri di file. Dopo aver inserito correttamente lo sql, fa un inserto in una tabella delle versioni.

Più team su cui lavoro creando un repository in github e tutti gli sviluppatori di repository dipendono da questo. api usa la prima cifra per identificare lo script.

grazie

+0

I collegamenti a strumenti di terze parti per rispondere alle domande sono generalmente disapprovati dalla comunità Overflow dello stack. – Kmeixner

0

ho lavorato per una società, che aveva ganci sul nostro server di controllo del codice sorgente, che su un commit, sarebbe eseguire uno script, che al suo centro ha creato un mysql discarica schema dai nostri database dev e messa in scena, e dal diff tra questi schemi, creerebbe uno script sql che, se eseguito, consentirebbe a un terzo database (una copia di staging) di essere modificato per produrre un database con lo stesso schema di dev, ma contenente tutti i dati sulla staging . Avrebbe poi eseguito tutti i test e, se avessero avuto successo, avrebbe presentato lo script sql delta, come sicuro da eseguire in produzione.
Finché si ha un evento, a quel punto è possibile eseguire uno script, è possibile generare allo stesso modo uno script sql, che sposta lo schema in avanti nel nuovo delta.
L'alternativa sarebbe semplicemente quella di tenere traccia dello schema sql, nel controllo della versione ad ogni modifica, ma questo significherebbe che avrebbe bisogno di un umano per risolvere (dalla differenza unificata), quale sql sarebbe necessario per implementare il cambiamento.

+0

Direi che questo è il più vicino a quello che voglio, ma allo stesso tempo questa risposta suggerisce che posso scrivere solo il mio se voglio la funzione? – cytsunny

+0

Sì, ma la generazione di uno script sql delta da 2 schemi non è così difficile, se si dispone di un hook che può eseguire uno script di shell al momento giusto. Ci sono probabilmente strumenti o script là fuori per generare un delta o ottenere la maggior parte del modo. mysqldump ti darà lo schema in un formato prevedibile, se spegni la parte dei dati e le opzioni specifiche di mysql, ciò che rimane è relativamente facile da analizzare. – sibaz

+0

Se devi scrivere lo script per te stesso, vale la pena tener presente che se si creano 2 database dallo stesso dump, sullo stesso server mysql, quando si generano nuovi dump dello schema, verranno ordinati allo stesso modo . Finché si aggiungono solo gli schemi (nello stesso ordine) e non si rilascia/ricarica uno e non l'altro, rimarranno ordinati allo stesso modo, quindi gli schemi possono essere semplicemente confrontati come un file di stringa in sezioni . Il più veloce sarebbe quello di generare un diff, quindi analizzare quello per ottenere i bit appropriati dallo schema, ma sarebbe anche probabilmente lo script più complesso. – sibaz

1

Si potrebbe provare Phinx Attualmente utilizzo dbv.php come menzionato in un'altra risposta, ma Phinx sembra avere opzioni più avanzate che possono aiutarti a raggiungere i tuoi obiettivi.È possibile trovare la documentazione qui http://docs.phinx.org/en/latest/ e c'è un progetto di esempio dell'autore here

+0

Phinx richiede zend framework e sembra solo un altro plug-in di migrazione come quello fornito da laravel. dbv.php sembra quello che voglio, ma sarebbe bello se potessi avere un po 'più di aiuto per iniziare a usarlo. – cytsunny

0

La risposta è semplice. Basta usare un file .sql che specifica lo schema db. Ramo e modifica il file .sql per te diverso a seconda delle necessità. Puoi specificare tutto ciò che ti serve come la creazione del database e delle tabelle.

Se hai bisogno di qualcosa per iniziare, puoi fare un mysqldump sul tuo db e iniziare con quello. Dopo aver avuto il file nel ramo di controllo del codice sorgente e l'unione sono semplici dopo.

Un'altra opzione potrebbe essere quella di creare il db dump di base, quindi disporre di vari script di alterazione che potrebbero personalizzare il db in base alle proprie esigenze. Avere i diversi progetti caricare il db dump, quindi applicare gli script appropriati.