Como gerenciar alterações de esquema do banco de dados em versões de projeto de código aberto

9

Eu gerencio um aplicativo da web de código aberto PHP / MySQL usado por algumas escolas de ensino fundamental e médio e algumas faculdades. Eu também sou o único desenvolvedor do projeto. Embora fosse pouco mais do que o download de um aplicativo que meu empregador hospeda na fonte, trabalhei no último ano para transformá-lo em um projeto de código aberto "real", com documentação, lançamentos numerados, registros de alterações públicos etc.

Eu estou procurando melhorar o processo de atualização, e uma das áreas potencialmente dolorosas (especialmente para escolas famintas por especialistas em TI) está em alterações no esquema do banco de dados entre os lançamentos. Eles não costumam acontecer com frequência ou são mudanças drásticas, mas eu gostaria de receber sugestões sobre o processo.

Atualmente, mantenho um script de instalação SQL básico para configurar o banco de dados em uma nova instalação. Isso inclui o esquema completo da versão atual; nenhuma ação adicional é necessária para uma nova instalação. As alterações que ocorrem entre os releases são armazenadas em upgrade-$releasever.sqlscripts, e é necessário executar todos os scripts de atualização incrementalmente para todos os releases que foram ignorados.

Os scripts do shell não são adequados, porque muitos de nossos usuários operam em hosts sem acesso ao shell. Devido a outras prioridades, é improvável que um script complexo de instalação / atualização baseado no navegador PHP se materialize. Gostaria, no entanto, de fazer algo com um script PHP baseado em navegador para simplificar as atualizações. Sugestões sobre como abordá-lo?

Michael
fonte

Respostas:

3

Meu projeto possui um arquivo update.php que o usuário executa no navegador depois de instalar uma nova versão do software. Esse script de atualização verifica um número de versão do banco de dados que é mantido em uma tabela no banco de dados ativo e faz quaisquer operações de alteração de banco de dados que irão obter esse esquema de banco de dados até o último, o que inclui a atualização desse número de versão do banco de dados.

pyasi
fonte
Examinei o seu script upgrade.php e isso parece ser o que eu tinha em mente. Obrigado.
1328 Michael
2

O Drupal CMS tem uma solução interessante para o seu problema. Sugiro dar uma olhada no Drupal em geral, se você estiver desenvolvendo soluções baseadas na Web usando PHP. É o meu PHP CMS favorito e eu serei tendencioso o suficiente para dizer que é o melhor por aí. ;)

O Drupal oferece um invólucro de interação com o banco de dados bastante sofisticado. Ele permite abstrair o tipo de banco de dados real do desenvolvedor do módulo, para que você realmente não se importe se o servidor está executando o PostgreSQL, MySQL, etc. Você também pode criar sua própria interface. Todos os módulos são necessários para fornecer o arquivo module.install que contém hook_schemae hook_install. hook_schemaé usado para declarar o esquema da tabela para o módulo, enquanto hook_installexecuta o procedimento de instalação. A arquitetura também suporta a noção de atualizações; portanto, se o usuário já tiver o módulo instalado, os ganchos corretos de atualização serão chamados e permitirão a atualização do esquema da tabela facilmente.

Dê uma olhada: http://drupal.org/node/146862 Mesmo que o Drupal não seja para você, tenho certeza que você pode aprender algo com as decisões de arquitetura deles.

sneg
fonte
0

Fizemos isso criando pastas de versão. Colocamos todos os scripts de banco de dados nessa pasta. Quando chegou a hora de lançar isso para um novo cliente, eles obtiveram a versão mais recente.

Também mantivemos os scripts de atualização nessa pasta. Dessa forma, poderíamos migrar um cliente da versão x para a versão y.

Não é o melhor método ... mas funcionou para nós.

Michael Riley - também conhecido por Gunny
fonte
Se eu entendo, isso parece semelhante à forma como estou lidando com isso agora - colocando meus usuários encarregados de executar os scripts de atualização eles mesmos e na ordem correta.
1328 Michael