Gestione dello schema del database per un'applicazione C ++

2

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
posta Daenyth 02.07.2014 - 16:50
fonte

3 risposte

2

Il pensiero principale sulla gestione dei DB non è quello di raggrupparlo nell'applicazione, ma di raggrupparlo nell'installer. Devo ammettere che tutto il progetto su cui lavoro ha un team operativo (di qualche tipo) per l'installazione, quindi forse sono un po 'ammiccato qui.

Tuttavia i passaggi sono sensati. Io tendo a creare uno script di aggiornamento per ogni aggiornamento di versione piuttosto che molti piccoli passaggi di aggiornamento, ma Rails sembra funzionare bene con una serie numerata di script di aggiornamento per ciascuna funzione.

Dato che SQL è autonomo, continuo a pensare che un'app per eseguirlo non sia necessaria: un file batch aprirà felicemente il DB ed eseguirà sql in. Lo facciamo negli strumenti da riga di comando di SQLServer per tutto il tempo, MySQL esegue sulla riga di comando, utilizzando il comando source per eseguire direttamente un file sql.

    
risposta data 02.07.2014 - 17:46
fonte
0

Se stai facendo l'upgrade all'interno dell'applicazione client in questo modo, il tuo approccio funzionerà. Direi che non è necessario fare altro che controllare la versione dello schema nel database e applicare le istruzioni SQL pertinenti per aggiornare lo schema. Quindi salterò il passaggio in cui si tenta di confrontare lo schema con un altro database zero.

    
risposta data 02.07.2014 - 19:32
fonte
0

Potresti prendere in considerazione la creazione delle tabelle come parte dell'installazione.

In alternativa, il tuo programma C ++ potrebbe emettere dichiarazioni di CREATE TABLE IF NOT EXISTS Mysql . Quindi funzionerebbe quando esistono le tabelle (caso normale) o quando non esistono.

E potresti interrogare l'esistenza e le colonne di tabelle precedenti con ad es. MOSTRA TABELLE & MOSTRA COLONNE e / o SHOW CREATE TABLE - o usa Information Schema (quindi più tardi ALTER TABLE se necessario)

    
risposta data 02.07.2014 - 18:28
fonte

Leggi altre domande sui tag