Migrazione all'indietro con Django South


217

Ok, quindi questa sembra una cosa davvero sciocca da chiedere, e sono sicuro che mi manchi qualcosa da qualche parte.

Come si esegue una migrazione all'indietro utilizzando South su Django?

Quindi ho modificato i miei modelli, creato una migrazione schemamigration, eseguito la migrazione conmigrate e ora mi rendo conto che non è proprio quello che volevo e lo voglio indietro nel modo precedente.

A parte la modifica manuale delle tabelle db e la rimozione dei file di migrazione, come devo fare per ripristinare la migrazione? Trovo riferimenti a migrazioni all'indietro utilizzando South tramite Google, ma non ho ancora trovato un esempio di codice valido per questo.

Qualcuno può aiutare?


buona domanda!!
Marshall X

Risposte:


335

È necessario capire il numero della migrazione appena prima di quello che si desidera ripristinare.

La tua app dovrebbe avere una directory delle migrazioni, con i file in essa denominati like

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

Normalmente, quando corri ./manage.py migrate your_app , South esegue tutte le nuove migrazioni, in ordine. (Guarda le tabelle del database per decidere quali sono "nuove").

Tuttavia, puoi anche specificare qualsiasi migrazione per numero e South eseguirà la migrazione del database, sia in avanti che all'indietro , per portarlo a quel punto. Quindi, con i file di esempio sopra, se hai già migrato fino a 0003 e volevi eseguire 0003 al contrario (annullandolo, in modo efficace), avresti eseguito

./manage.py migrate your_app 0002

South esaminerebbe il database, si renderebbe conto che ha già eseguito 0003 e determinerebbe che deve eseguire la migrazione inversa per 0003 per tornare a 0002.


1
Sfortunatamente, quando crei la tua prossima migrazione, non salterà quelle intermedie, quindi dovrai migrare di nuovo attraverso di loro in seguito. Sembra che ci potrebbe essere un modo migliore.
mlissner,

44
@mlissner Se vuoi davvero, dopo aver eseguito il rollback del database, vai alla cartella delle migrazioni dell'app fornita (nell'esempio precedente your_app / migrations) ed elimina la migrazione indesiderata
Josh Russo

1
Esatto: il Sud non salta mai le migrazioni; si aspetta che i file da 0001-nnnn rappresentino un insieme coerente di migrazioni, per qualsiasi valore di nnnn. In caso contrario, è necessario riordinare o eliminare da soli quelli offensivi.
Ian Clelland,

217

Nel caso in cui qualcuno (come me) si chiedesse come tornare indietro dall'iniziale (0001) :

django-admin.py migrate some_app zero

produzione:

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

"zero" è uno stato speciale prima di qualsiasi migrazione.

Riferimento: http://south.aeracode.org/docs/commands.html


6
Qualcuno ha eseguito la migrazione di 0001 --fake, e questo era l'unico modo per eseguire 0001 al contrario. Grazie!
jmanning2k,

1
Risposta molto importante, mi chiedevo perché migrate 0000non funzionasse. Per quanto riguarda la migrazione fasulla, sì, potresti averne bisogno, ad esempio se devi solo annullare la migrazione iniziale (probabilmente errata), ma la cronologia delle migrazioni ritiene che questa migrazione non sia mai avvenuta.
Tomasz Gandor,

3

Aggiungi un nome di migrazione alla fine dei parametri:

./manage.py migrate app-name 00xx-migration-name

2
Va bene, e l'ho già fatto prima, ma è un sacco di digitare / incollare. Il numero "stato" nudo - in questo caso 00xx- è sufficiente. Quando si migliora e si verifica una migrazione è possibile avere entrambi i comandi nella cronologia: avanti (nessun argomento), indietro con il numero di stato precedente.
Tomasz Gandor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.