Migração para trás com o Django Sul

217

Ok, então isso parece uma coisa muito boba de se perguntar, e tenho certeza que estou perdendo alguma coisa em algum lugar.

Como você executa uma migração para trás usando o South no Django?

Então, aprimorei meus modelos, criei uma migração schemamigration, executei a migração migratee agora percebo que não era exatamente isso que eu queria, e que quero isso de volta antes.

Além de editar manualmente as tabelas db e remover os arquivos de migração, como devo reverter a migração? Encontro referências a migrações anteriores usando o Sul via Google, mas ainda não encontrei um exemplo de código sólido.

Alguém pode ajudar?

Ruiwen
fonte
boa pergunta!!
Marshall X

Respostas:

335

Você precisa descobrir o número da migração antes da que deseja reverter.

Seu aplicativo deve ter um diretório de migrações, com arquivos nomeados como

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

Normalmente, quando você executa ./manage.py migrate your_app, o Sul executa todas as novas migrações, em ordem. (Ele examina as tabelas do banco de dados para decidir quais são 'novas').

No entanto, você também pode especificar qualquer migração por número, e o Sul migrará seu banco de dados, para frente ou para trás , para levá-lo a esse ponto. Portanto, com os arquivos de exemplo acima, se você já migrou até 0003 e desejou executar o 0003 ao contrário (desfazendo-o com eficiência), executaria

./manage.py migrate your_app 0002

South examinaria o banco de dados, perceberia que já executou 0003 e determinaria que deve executar a migração reversa para 0003 para retornar a 0002.

Ian Clelland
fonte
1
Infelizmente, quando você cria sua próxima migração, ela não pula as que estão no meio, então você apenas migra novamente mais tarde. Parece que poderia haver uma maneira melhor.
mlissner
44
@mlissner Se você realmente quer, depois de reverter o banco de dados, vá para as migrações pasta do aplicativo dado (na acima exemplo your_app / migrações) e excluir a migração indesejada
Josh Russo
1
Exatamente - o sul nunca pula migrações; espera que os arquivos de 0001-nnnn representem um conjunto consistente de migrações, para qualquer valor de nnnn. Se não for esse o caso, você precisará reordenar ou excluir os que são ofensivos.
21711 Ian Clelland
217

Apenas no caso de alguém (como eu) se perguntar como migrar de volta do inicial (0001) :

django-admin.py migrate some_app zero

resultado:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

"zero" é um estado especial antes de qualquer migração.

Referência: http://south.aeracode.org/docs/commands.html

Ctrl-C
fonte
6
Alguém executou migrate 0001 --fake, e essa foi a única maneira de executar o 0001 para trás. Obrigado!
jmanning2k
1
Resposta muito importante, eu me perguntava por migrate 0000que não funcionou. Sobre a migração falsa, sim, você pode precisar dela, se, por exemplo, precisar desfazer apenas a migração inicial (provavelmente incorreta), mas o histórico da migração pensa que essa migração nunca aconteceu.
Tomasz Gandor
3

Adicione um nome de migração no final dos parâmetros:

./manage.py migrate app-name 00xx-migration-name
Jerzyk
fonte
2
Está tudo bem, e eu fiz isso antes, mas é muita digitação / colagem. O número simples de "estado" - neste caso 00xx- é suficiente. Ao melhorar e testar uma migração, você pode ter os dois comandos no histórico: encaminhar (sem argumento), retroceder com o número do estado anterior.
Tomasz Gandor