O que é um caminho sensato para executar uma migração radical Django Modelo em um ambiente de produção?

votos
2

Eu tenho uma web aplicação Django existente que está em uso. Eu tenho que migrar radicalmente um modelo fundamental no meu projeto para um design completamente novo, mas eu quero para armazenar em cache todos os dados existentes para esse modelo e migrá-los para os novos registros na produção quando estiver pronto para implantar.

Eu posso dar ao luxo de trazer o meu site para baixo por algumas horas uma noite e fazer o que eu preciso fazer para migrar. Quais são algumas maneiras sensatas que eu posso fazer essa migração?

Parece qualquer migração teria necessidade de: 1) Dump todos os dados existentes em algum formato, como SQL, JSON, XML 2) Migrar o modelo para o novo formato 3) Atualizar os dados para o novo modelo usando um script de conversão

Também pensei em tentar armazenar todos os dados existentes em algum outro modelo chamado OldModel (se Modelo é o nome do modelo existente) e, em seguida, migrar os dados viver.

Publicado 19/03/2009 em 20:34
fonte usuário
Em outras línguas...                            


4 respostas

votos
4

Existe um projeto para ajudar com as migrações que eu ouvi falar: Sul .

Dito isto, eu admito que não usei. Nós ainda planejar nossas migrações usando um arquivo de instruções SQL. Loucura, eu sei, mas tem a vantagem da capacidade de teste. Você pode executá-lo quantas vezes for necessário durante o desenvolvimento e teste de estadiamento antes do "grande implantação". Ele pode ser fonte controlada, diffed, etc Pode também, por conseguinte, ser chamado a partir de um script de implantação maiores. Claro, nós backup de produção antes de executá-lo :-)

Se seu banco de dados faz diário, usando o método antiquado tem a vantagem adicional de que existe um histórico de transações que podem ser revertidas.

Experimentos nós funcionamos com JSON, XML e "OldModel" -> "NewModel" lixeiras estilo reduziram muito mal. Mente-lhe, YMMV ... temos um grande banco de dados bastante. Usando um script, você pode executar em seu banco de dados de produção sem ter que descarregar ou recarregar grandes quantidades de dados. Desta forma, mesmo uma migração complicada pode demorar alguns segundos, em vez de horas.

Respondeu 19/03/2009 em 20:45
fonte usuário

votos
1

Faça todas as migrações em etapas!

Se você precisa adicionar um campo, vá em frente e adicioná-lo, com um valor padrão ou ser opcional. Isto é seguro. Se você precisar fazer um campo opcional existente necessário, dar-lhe um padrão em primeiro lugar. Se você precisar fazer um campo existente com um padrão não tem um padrão, deixe cair o padrão após a fixação todo o código que cria instâncias. Se você precisar alterar o tipo de um campo, adicionar um novo campo que herda o valor do atual, em primeiro lugar. Em seguida, execute um script para atualizar as instâncias existentes para preencher o novo campo. Em terceiro lugar, Remova todo o código que utiliza o campo de idade para usar o novo. Finalmente, o que nenhum código é deixado usando o original, você pode deixá-lo cair.

Para cada situação, há um pequeno passo que você pode fazer. Para cada mudança maior, você pode dividi-la em pequenos. Este é um lugar de desenvolvimento iterativo compensa. Manter bons backups no lugar e não tenha medo de empurrar muitas vezes! Faça as pequenas mudanças rapidamente para ver se eles funcionam.

Respondeu 20/03/2009 em 14:43
fonte usuário

votos
1

Há cerca de 5 ou 6 ferramentas para ajudar a automatizar uma parte das migrações. Vários deles estão listados na esta pergunta e eu vou adicionar os outros apenas para ser completo.

Em seguida, ver de S. Lott resposta a esta pergunta sobre os fluxos de trabalho de migração para uma grande idéia sobre como usar números de versão no nome do modelo para fazer migrações mais fácil, incluindo a estruturação de um script independente para converter corretamente as tabelas. Para minha mente esta é muito superior a serialização os dados para a exportação e, em seguida, tentando construir suas novas tabelas importando.

Finalmente, eu não tenho sido capaz de pensar em uma maneira de fazer uma migração quente corretamente e não vi quaisquer sugestões de qualquer outro lugar ou, então, manutenção tempo de inatividade é inevitável.

Respondeu 19/03/2009 em 23:07
fonte usuário

votos
1

Se você está mais confortável com o Django ORM do que com SQL cru, você pode considerar o uso de Model -> BackupModel -> TestModel -> Modelo, onde todos, mas o último passo pode ser realizada sem deixar cair dados.

def backup(InModel,OutModel):
    in_objs = InModel.objects.all()
    for obj in in_objs:
        out_obj = OutModel.convert_from(InModel,obj)
        out_obj.save()

Aqui, você teria apenas que se certificar de que todos os seus modelos têm métodos convert_from implementado. Estes devem ser conversões triviais, exceto para BackupModel -> TestModel. Nos outros casos, nada mais que a classe mudaria, todos os dados que estão sendo idêntica preservada.

A vantagem disso é que antes de ir reescrever todas as suas interfaces, você pode brincar com TestModel e certifique-se de que as suas conversões eram o que você pensou que seria. Se tudo der errado, você converter de BackupModel-> Modelo, e tudo está bem. Em um cenário de pior caso, você desistir de ORM do Django, correr de volta para SQL, e simplesmente mudar o nome de todas as suas tabelas que começam com backupmodel __ * para modelar __ * em seu banco de dados.

Disclaimer: Eu nunca fiz isso.

Respondeu 19/03/2009 em 22:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more