Já existem perguntas semelhantes para South, mas eu comecei meu projeto com Django 1.7 e não estou usando South.
Durante o desenvolvimento, muitas migrações foram criadas, no entanto, o software ainda não foi entregue e não existe nenhum banco de dados que deva ser migrado. Portanto, gostaria de redefinir as migrações como se meu modelo atual fosse o original e recriar todos os bancos de dados.
Qual é a forma recomendada de fazer isso?
EDIT: A partir do Django 1.8, há um novo comando chamado squashmigrations que mais ou menos resolve o problema descrito aqui.
django
django-migrations
django-1.7
Kit Fisto
fonte
fonte
Respostas:
Eu tenho esse. Acabei de descobrir isso e é bom.
Primeiro, para limpar a tabela de migrações:
Remova a
app-name/migrations/
pasta ou conteúdo.Faça as migrações:
Por fim, organize suas migrações sem fazer outras alterações no banco de dados:
fonte
zero
. Para o sistema de migração Django,<app-name>
agora é um novo aplicativo emakemigrations <app-name>
começará a partir0001
.--fake
evita que as tabelas sejam realmente modificadas, que as migrações só devem ser marcadas como reversas e não aplicadas ao esquema. (Adicionando pequenas explicações para fins de integridade, @ tani-rokk, @Fabrizio)manage.py migrate --fake <app-name> zero
para limpar a tabela de migrações e, em seguida, remova <app-name> / migrations / pasta ou conteúdo. Entãomanage.py makemigrations <app-name>
e finalmente façamanage.py migrate --fake <app-name>
. Isso organizará suas migrações sem fazer outras alterações no banco de dados.Na versão de migrações do Django 1.7, a funcionalidade de redefinição que costumava ser no Sul foi descartada em favor de uma nova funcionalidade para 'esmagar' suas migrações. Essa é uma boa maneira de manter o número de migrações sob controle.
https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations
Se você ainda quiser realmente começar do zero, suponho que ainda possa esvaziar a tabela de migrações e remover as migrações, após o que você executaria
makemigrations
novamente.fonte
raise KeyError("Migration %s dependencies reference nonexistent parent node %r" % (migration, parent))
./manage.py squashmigrations myapp 0004
, esmagará todas as migrações antes da migração0004
em seu aplicativomyapp
. Isso criará uma única migração comprimida.Eu simplesmente tive o mesmo problema. Aqui está minha solução alternativa.
O
find
comando: http://unixhelp.ed.ac.uk/CGI/man-cgi?findfonte
Supondo que esta seja a estrutura do seu projeto,
você pode executar o script remove_migrations.py do local indicado acima para excluir todos os arquivos de migração.
A exclusão manual pode ser cansativa se você tiver um projeto elaborado. Isso me economizou muito tempo. Excluir arquivos de migração é seguro. Já fiz isso uma enésima série de vezes sem enfrentar quaisquer problemas ... ainda.
No entanto, quando apaguei a pasta de migrações
makemigrations
oumigrate
não criei a pasta de volta para mim. O script garante que a pasta de migração com a sua__init__.py
permaneça no lugar, apenas excluindo os arquivos de migração.fonte
touch migrations/__init__.py
)DELETE FROM django_migrations Where app in ('app1', 'app2');
./manage.py makemigrations
./manage.py migrate --fake
OU, você pode escrever a migração de tudo isso
fonte
./manage.py makemigrations
funcionar, assim:./manage.py makemigrations orders alerts
Tento comandos diferentes e algumas das respostas me ajudam. Somente esta sequência no meu caso corrigiu as dependências quebradas nas migrações no MYAPP e limpou todas as migrações anteriores começando do zero.
Antes de fazer isso, certifique-se de que o banco de dados já esteja sincronizado (por exemplo, não adicione um novo campo de modelo aqui ou altere as opções de Meta).
Onde 0002 é o número de migração retornado pelo último comando makemigrations.
Agora você pode executar makemigrations / migrate novamente normalmente porque a migração 0002 está armazenada, mas não é refletida no banco de dados já sincronizado.
fonte
Se você não se preocupa com as migrações anteriores, que tal remover apenas todas as migrações do diretório / migrações? você vai começar a sequência de migração do zero, tomando seu modelo atual como referência, como se você tivesse escrito o modelo inteiro agora.
Se você não confia em mim o suficiente para removê-los, tente movê-los para longe.
fonte
Uma maneira simples é
Vá para cada aplicativo e exclua os arquivos de migração.
Em seguida, vá para a tabela django-migrtaions no banco de dados e trunque-a (exclua todas as entradas).
Depois disso, você pode criar migrações novamente.
fonte
cd para diretório src
cd /path/to/src
deletar diretórios de migração
rm -rf your_app/migrations/
observe que isso deve ser feito para cada aplicativo separadamente
migrar
python3.3 manage.py migrate
se você deseja começar de novo
python3.3 manage.py makemigrations your_app
fonte
Se você está em modo de desenvolvimento e deseja apenas resetar tudo (banco de dados, migrações, etc), utilizo este script baseado na resposta de Abdelhamid Ba. Isso limpará as tabelas do banco de dados (Postgres), excluirá todos os arquivos de migração, executará novamente as migrações e carregará meus acessórios iniciais:
arquivo reset-db.sql:
arquivo migration.sh:
arquivo load_initial_fixtures.sh:
Apenas certifique-se de alterar os caminhos que correspondem ao seu aplicativo. Eu pessoalmente tenho esses scripts em uma pasta chamada project_root / script / local, e os fontes do django estão em project_root / src.
fonte
Depois de excluir cada pasta de "migrações" em meu aplicativo (manualmente), executei:
Então eu pensei que poderia apenas fazer
./manage.py makemigrations
para regenerar todos eles. No entanto, nenhuma alteração foi detectada. Em seguida, tentei especificar um aplicativo por vez:./manage.py makemigrations foo
,./manage.py makemigrations bar
. No entanto, isso resultou em dependências circulares que não puderam ser resolvidas.Por fim, executei um único comando makemigrations que especificou TODOS os meus aplicativos (sem nenhuma ordem específica):
Desta vez, funcionou - as dependências circulares foram resolvidas automaticamente (ele criou arquivos de migração adicionais quando necessário).
Então consegui fugir
./manage.py migrate --fake
e voltei ao negócio.fonte