Eu acumulei algumas migrações usando o South (0.7) e o Django (1.1.2), que estão começando a consumir bastante tempo em meus testes de unidade. Gostaria de redefinir a linha de base e iniciar um novo conjunto de migrações. Analisei a documentação do Sul , fiz a pesquisa usual do Google / Stackoverflow (por exemplo, "django sul (redefinir ou excluir ou remover) histórico de migração") e não encontrei nada óbvio.
Uma abordagem que eu contemplava envolvia "recomeçar" removendo "Sul" ou "limpando" o histórico manualmente (por exemplo, limpe a tabela db, remova arquivos de migração do diretor de migrações) e apenas execute novamente,
./manage.py schemamigration southtut --initial
Portanto, se alguém já fez isso antes e tem algumas dicas / sugestões, seria muito apreciado.
fonte
__init__.py
aappname/migrations
./manage.py makemigrations
, mas as coisas ruins vão acontecer se você não começar a partir de um db fresco ...squashmigrations
é a resposta certaRespostas:
Primeiro, uma resposta do autor sul :
Aqui está o que estou fazendo no meu servidor de produção dev + quando preciso me livrar de todas essas migrações desnecessárias de desenvolvedores:
* exceto se você deseja limpar apenas um aplicativo entre outros, caso seja necessário, edite sua tabela south_history e exclua apenas as entradas do seu aplicativo.
fonte
manage.py schemamigration app name --initial
vez de convert_to_south.south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
são perigosos e podem destruir o banco de dados se houver aplicativos de terceiros usando o sul no projeto, conforme apontado por @ thnee abaixo. Como sua resposta tem tantos votos positivos, eu realmente apreciaria se você pudesse editá-la e adicionar pelo menos um aviso sobre isso, ou (melhor ainda) alterá-la para refletir a abordagem @hobs (que é tão conveniente quanto não é) afetar outros aplicativos) - obrigado!Se você precisar redefinir seletivamente (para apenas um aplicativo) as migrações que estão demorando muito, isso funcionou para mim.
Não se esqueça de restaurar manualmente as dependências de outros aplicativos adicionando linhas como o
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
seu<app-dir>/migrations/0001_initial.py
arquivo, como o primeiro atributo na sua classe de migração logo abaixoclass Migration(SchemaMigration):
.Você pode, então,
./manage.py migrate <app-name> --fake --delete-ghost-migrations
em outros ambientes, de acordo com essa resposta do SO . Obviamente, se você falsificar a exclusão ou a falsificação,migrate zero
precisará excluir manualmente quaisquer tabelas de banco de dados restantes com uma migração como essa .Uma opção mais nuclear é
./manage.py migrate --fake --delete-ghost-migrations
no servidor de implantação ao vivo, seguido por um [my] sqldump. Em seguida, canalize esse dump no [my] sql nos ambientes em que você precisa do banco de dados migrado e totalmente preenchido. Sei que o sacrilégio sul, mas funcionou para mim.fonte
DependsOnUnknownMigration
pouco para fingir a nova migração inicial. Graças ao seu comentário, eu pude descobrir que devo atualizar adepends_on
declaração sempre que ela se referir a este aplicativo. Esta é realmente a melhor resposta aqui. Obrigado! :)Graças às respostas de Dominique Guardiola e fogão, isso me ajudou a resolver um problema difícil. No entanto, existem alguns problemas com a solução, aqui está minha opinião.
Usar não
manage.py reset south
é uma boa ideia se você tiver aplicativos de terceiros que usam o Sul, por exemplodjango-cms
(basicamente tudo usa o Sul).reset south
excluirá todo o histórico de migração de todos os aplicativos que você instalou.Agora considere que você atualiza para a versão mais recente do
django-cms
, ela conterá novas migrações como0009_do_something.py
. O Sul certamente ficará confuso quando você tentar executar essa migração sem0001
passar0008
no histórico de migração.É muito melhor / mais seguro redefinir seletivamente apenas os aplicativos que você está mantendo .
Primeiro, verifique se seus aplicativos não têm dessincronização entre migrações em disco e migrações que foram executadas no banco de dados. Caso contrário, haverá dor de cabeça.
1. Excluir histórico de migração para meus aplicativos
2. Excluir migrações para meus aplicativos
3. Crie novas migrações iniciais para meus aplicativos
4. Execute falsamente as migrações iniciais para meus aplicativos
Isso insere as migrações
south_migrationhistory
sem tocar nas tabelas reais:As etapas 3 e 4 são na verdade apenas uma variante mais longa
manage.py convert_to_south my_app
, mas eu prefiro esse controle extra, em situações delicadas como modificar o banco de dados de produção.fonte
./manage.py migrate --fake
se não desejar migrar outros aplicativos com migração pendente.Como em seguida (veja a resposta dela), estamos usando uma abordagem mais suave à sugestão do autor do sul (Andrew Godwin) citada em outro lugar aqui e estamos separando o que fazemos com a base de código do que fazemos com o banco de dados, durante a implantação , porque precisamos que as implantações sejam repetíveis:
O que fazemos no código:
O que fazemos no banco de dados após a implantação desse código
fonte
Se você está apenas trabalhando na máquina dev, escrevi um comando de gerenciamento que faz praticamente o que Dominique sugeriu.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
Ao contrário da sugestão do autor sul, isso NÃO prejudicará outros aplicativos instalados usando o sul.
fonte
A seguir, apenas se você deseja redefinir todos os aplicativos. Faça backup de todos os seus bancos de dados antes desse trabalho. Anote também sua dependência nos arquivos iniciais, se houver.
De uma vez:
Teste a inicialização do seu projeto antes do envio por push. Em seguida, para cada máquina local / remota, aplique o seguinte:
Faça inicial (3) para cada aplicativo que você deseja envolver novamente. Observe que, o reset (6) excluirá apenas o histórico de migração, portanto, não é prejudicial para as bibliotecas. Migrações falsas (7) recuperam o histórico de migração de qualquer aplicativo de terceiros instalado.
fonte
excluir o arquivo necessário da pasta do aplicativo
caminho da instância
wiki -é meu aplicativo
fonte