Come gestire le modifiche dello schema del database nelle versioni di progetti open source


9

Gestisco un'applicazione web open source PHP / MySQL utilizzata da alcune scuole K-12 e alcuni college. Sono anche l'unico sviluppatore del progetto. Sebbene in passato fosse poco più che un download sorgente di un'applicazione ospitata dal mio datore di lavoro, nell'ultimo anno ho lavorato per trasformarlo in un "vero" progetto open source, con documentazione, pubblicazioni numerate, log pubblici, ecc.

Sto cercando di migliorare il processo di aggiornamento e una delle aree potenzialmente dolorose (soprattutto per le scuole affamate di competenze IT) è nelle modifiche allo schema del database tra le versioni. Non tendono ad accadere spesso o sono cambiamenti drastici, ma apprezzerei i suggerimenti sul processo.

Attualmente, mantengo uno script di installazione SQL di base per configurare il database in una nuova installazione. Ciò include lo schema completo per la versione corrente; non sono necessarie ulteriori azioni per una nuova installazione. Le modifiche che si verificano tra le versioni sono memorizzate negli upgrade-$releasever.sqlscript ed è necessario eseguire tutti gli script di aggiornamento in modo incrementale per tutte le versioni che sono state ignorate.

Gli script della shell non sono adatti, poiché molti dei nostri utenti operano su host senza accesso alla shell. A causa di altre priorità, è improbabile che si realizzi un complesso script di installazione / aggiornamento basato su browser PHP. Vorrei, tuttavia, fare qualcosa con uno script PHP basato su browser per semplificare gli aggiornamenti. Suggerimenti su come affrontarlo?

Risposte:


3

Il mio progetto ha un file update.php che l'utente esegue attraverso il proprio browser dopo aver installato una nuova versione del software. Lo script di aggiornamento controlla un numero di versione del database che è conservato in una tabella nel database attivo e fa qualsiasi operazione di modifica del database che porterà lo schema del database a quello più recente, che include l'aggiornamento di quel numero di versione del database.


Ho guardato il tuo script upgrade.php e quello sembra essere quello che avevo in mente. Grazie.
Michael,

2

Drupal CMS ha una soluzione interessante al tuo problema. Ti suggerisco di dare un'occhiata a Drupal in generale, se stai sviluppando soluzioni basate sul web usando PHP. È il mio CMS PHP preferito e sarò abbastanza prevenuto da dire che è il migliore in circolazione. ;)

Drupal offre un wrapper di interazione con il database piuttosto sofisticato. Permette di estrarre il tipo di database effettivo dallo sviluppatore del modulo, quindi non ti interessa davvero se il server esegue PostgreSQL, MySQL, ecc. Puoi anche creare la tua interfaccia. Ogni modulo è tenuto a fornire il file module.install che contiene hook_schemae hook_install. hook_schemaviene utilizzato per dichiarare lo schema delle tabelle per il modulo, mentre hook_installesegue la procedura di installazione. L'architettura supporta anche la nozione di aggiornamenti, quindi se l'utente ha già installato il modulo, vengono richiamati i giusti hook di aggiornamento e consentono di aggiornare facilmente lo schema della tabella.

Dai un'occhiata: http://drupal.org/node/146862 Anche se Drupal non fa per te, sono sicuro che puoi imparare qualcosa dalle loro decisioni architettoniche.


0

Lo abbiamo fatto creando cartelle di versioni. Abbiamo inserito tutti gli script del database in quella cartella. Quando è arrivato il momento di distribuire questo a un nuovo cliente, hanno ottenuto l'ultima versione.

Abbiamo anche mantenuto gli script di aggiornamento in questa cartella. In questo modo potremmo migrare un cliente dalla versione x alla versione y.

Non è il metodo migliore ... ma ha funzionato per noi.


Se ho capito, sembra simile a come lo sto gestendo ora - mettendo i miei utenti a capo dell'esecuzione degli script di aggiornamento stessi e nell'ordine corretto.
Michael,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.