Estou trabalhando em um aplicativo de trilhos com algumas ramificações git e muitas delas incluem migrações de banco de dados. Tentamos ser cuidadosos, mas ocasionalmente algum pedaço de código no master solicita uma coluna que foi removida / renomeada em outro ramo.
Qual seria uma boa solução para "unir" ramificações git com estados de banco de dados?
Quais seriam esses "estados" realmente?
Não podemos apenas duplicar um banco de dados se tiver alguns GBs de tamanho.
E o que deve acontecer com as mesclagens?
A solução também se traduziria em bancos de dados noSQL?
Atualmente, usamos MySQL, mongodb e redis
Edição: Parece que eu esqueci de mencionar um ponto muito importante, estou interessado apenas no ambiente de desenvolvimento, mas com grandes bancos de dados (alguns GBs de tamanho).
fonte
Respostas:
Ao adicionar uma nova migração em qualquer ramificação, execute
rake db:migrate
e confirme a migração edb/schema.rb
Se você fizer isso, no desenvolvimento, poderá mudar para outro ramo que possui um conjunto diferente de migrações e simplesmente executar
rake db:schema:load
.Observe que isso recriará o banco de dados inteiro e os dados existentes serão perdidos .
Provavelmente, você só quer executar a produção de um ramo com o qual tenha muito cuidado, para que essas etapas não se apliquem lá (apenas execute
rake db:migrate
como de costume). Mas no desenvolvimento, não deve ser grande coisa recriar o banco de dados a partir do esquema, que é o querake db:schema:load
fará.fonte
db/seeds.rb
Não deve ser muito devastador destruir o seu banco de dados de desenvolvimento se você configurar alguns dados de sementes razoáveis lá.db/seeds.rb
para ripopulating os dados db perdidosSe você possui um banco de dados grande que não pode ser reproduzido facilmente, recomendo o uso das ferramentas normais de migração. Se você deseja um processo simples, é isso que eu recomendaria:
rake db:rollback
) para o estado anterior ao ponto de ramificação. Depois de alternar ramificações, executedb:migrate
. Isso é matematicamente correto e, desde que você escrevadown
scripts, ele funcionará.fonte
rake db:schema:load
erake db:seed
como @noodl havia dito.Aqui está um script que eu escrevi para alternar entre ramificações que contêm diferentes migrações:
https://gist.github.com/4076864
Ele não resolverá todos os problemas que você mencionou, mas, com um nome de filial, ele irá:
Eu me vejo fazendo isso manualmente o tempo todo em nosso projeto, então achei que seria legal automatizar o processo.
fonte
git checkout db/schema.rb
ou quis dizergit checkout -- db/schema.rb
? (ou seja, com traços duplos)db/schema.rb
. :)Banco de dados separado para cada filial
É a única maneira de voar.
Atualização 16 de outubro de 2017
Voltei a isso depois de algum tempo e fiz algumas melhorias:
bundle exec rake git:branch
.db:clone_from_branch
tarefa leva umSOURCE_BRANCH
e umaTARGET_BRANCH
variável de ambiente. Ao usá-git:branch
lo, usará automaticamente o ramo atual como oSOURCE_BRANCH
.config/database.yml
E, para facilitar as coisas, veja como você atualiza seu
database.yml
arquivo para determinar dinamicamente o nome do banco de dados com base na ramificação atual.lib/tasks/db.rake
Aqui está uma tarefa do Rake para clonar facilmente seu banco de dados de um ramo para outro. Isso leva a
SOURCE_BRANCH
e aTARGET_BRANCH
variáveis de ambiente. Baseado na tarefa de @spalladino .lib/tasks/git.rake
Essa tarefa criará uma ramificação git fora da ramificação atual (master ou outra), faça check-out e clonará o banco de dados da ramificação atual no novo banco de dados da ramificação. É AF liso.
Agora, tudo o que você precisa fazer é executar
bundle exec git:branch
, inserir o novo nome do ramo e começar a matar zumbis.fonte
Talvez você deva considerar isso como uma dica de que seu banco de dados de desenvolvimento é muito grande? Se você pode usar db / seeds.rb e um conjunto de dados menor para desenvolvimento, seu problema pode ser facilmente resolvido usando schema.rb e seeds.rb da ramificação atual.
Isso pressupõe que sua pergunta esteja relacionada ao desenvolvimento; Não consigo imaginar por que você precisaria alternar regularmente as ramificações na produção.
fonte
db/seeds.rb
, vou dar uma olhada nisso.Eu estava lutando com o mesmo problema. Aqui está a minha solução:
Verifique se o schema.rb e todas as migrações foram registradas por todos os desenvolvedores.
Deve haver uma pessoa / máquina para implantações na produção. Vamos chamar esta máquina como a máquina de mesclagem. Quando as alterações são puxadas para a máquina de mesclagem, a mesclagem automática para schema.rb falhará. Sem problemas. Apenas substitua o conteúdo pelo conteúdo anterior para schema.rb (você pode deixar uma cópia de lado ou obtê-la no github se você a usar ...).
Aqui está o passo importante. As migrações de todos os desenvolvedores agora estarão disponíveis na pasta db / migrate. Vá em frente e execute o bundle exec rake db: migrate. Ele trará o banco de dados na máquina de mesclagem a par de todas as alterações. Ele também irá gerar o schema.rb.
Confirme e envie as alterações para todos os repositórios (controles remotos e indivíduos, que também são remotos). Você deveria estar pronto!
fonte
Foi isso que fiz e não tenho certeza de ter coberto todas as bases:
Em desenvolvimento (usando o postgresql):
Isso é muito mais rápido que os utilitários de rake em um banco de dados com cerca de 50 mil registros.
Para produção, mantenha a ramificação principal como sacrossanto e todas as migrações são registradas, shema.rb mescladas corretamente. Siga seu procedimento de atualização padrão.
fonte
Você deseja preservar um "ambiente de banco de dados" por filial. Observe o script smudge / clean para apontar para diferentes instâncias. Se você ficar sem instâncias de banco de dados, faça com que o script desative uma instância temporária; portanto, quando você alterna para uma nova ramificação, ela já existe e precisa ser renomeada pelo script. As atualizações do banco de dados devem ser executadas antes de você executar seus testes.
Espero que isto ajude.
fonte
Eu experimento totalmente a pita que você está tendo aqui. Na minha opinião, o problema real é que nem todos os ramos têm o código para reverter certos ramos. Estou no mundo do django, então não conheço muito bem o rake. Estou brincando com a idéia de que as migrações vivem em seu próprio repositório que não é ramificado (submódulo git, sobre o qual aprendi recentemente). Dessa forma, todos os ramos têm todas as migrações. A parte complicada é garantir que cada filial seja restrita apenas às migrações de que eles se preocupam. Fazer / acompanhar manualmente isso seria uma pita e propenso a erros. Mas nenhuma das ferramentas de migração foi criada para isso. Esse é o ponto em que estou sem um caminho a seguir.
fonte
Eu sugeriria uma das duas opções:
Opção 1
seeds.rb
. Uma boa opção é criar seus dados de sementes via gem FactoryGirl / Fabrication. Dessa forma, você pode garantir que os dados estejam sincronizados com o código, se considerarmos que as fábricas são atualizadas juntamente com a adição / remoção de colunas.rake db:reset
, que efetivamente descarta / cria / semeia o banco de dados.opção 2
Mantenha manualmente os estados do banco de dados executando sempre
rake db:rollback
/rake db:migrate
antes / após um check-out da filial. A ressalva é que todas as suas migrações precisam ser reversíveis, caso contrário, isso não funcionará.fonte
No ambiente de desenvolvimento:
Você deve trabalhar
rake db:migrate:redo
para testar se seu script é reversível, mas lembre-se sempre de ter umseed.rb
com a população de dados.Se você trabalha com o git, o seed.rb deve ser alterado com uma alteração de migração e a execução do
db:migrate:redo
início (carregue os dados para um novo desenvolvimento em outra máquina ou novo banco de dados)Além da 'mudança', com os métodos de subida e descida, seu código sempre cobre cenários para a "mudança" neste momento e quando começa do zero.
fonte