Ho un progetto open source ( Cockatrice ) che usa mysql per il componente server. Sto pianificando alcune modifiche allo schema, ma al momento l'unica gestione che ho è uno script che esegue le appropriate dichiarazioni CREATE TABLE
.
Prima di iniziare a implementare le modifiche mi piacerebbe avere una soluzione per la gestione dello schema. L'app è scritta in C ++ con Qt, e non sono stato in grado di trovare nulla come migrazioni di rails o giochi di evoluzione per C ++. Potrei semplicemente usarli, ma introdurrebbe una dipendenza completamente indipendente che sono riluttante a usare per questo.
Ho trovato un approccio e vorrei ricevere un riscontro sul fatto che abbia senso o che abbia degli svantaggi.
Aggiungi una nuova tabella per gestire lo schema, con una colonna della versione.
Le nuove migrazioni verrebbero aggiunte con uno script versione up, down e full creation (ad esempio 2.up.sql, 2.down.sql e 2.full.sql). Lo script up conterrebbe lo sql per eseguire l'upgrade, lo script down lo invertirà e il completo creerebbe un database da zero a quella versione.
Stavo pensando di scrivere uno script eseguibile dall'amministratore che avrebbe dovuto fare qualcosa di simile al seguente:
- Leggi la versione corrente da db
- cerca nuove patch
- blocca tutto db
- snapshot db meno le tabelle volatili
- avvia la transazione
- applica ogni file sql per portarlo alla versione più recente
- crea un db scratch e applica il sql completo
- confronta lo schema aggiornato con il db scratch
- se lo schema non corrisponde, errore di uscita e interruzione della transazione
- se corrisponde, elimina lo schema antigraffio
- Sblocca