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.sql
scripts, 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?
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_schema
ehook_install
.hook_schema
é usado para declarar o esquema da tabela para o módulo, enquantohook_install
executa 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.
fonte
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.
fonte