Mundur migrasi dengan Django Selatan

217

Ok, jadi ini sepertinya hal yang konyol untuk ditanyakan, dan saya yakin saya melewatkan sesuatu di suatu tempat.

Bagaimana Anda melakukan migrasi mundur menggunakan Selatan di Django?

Jadi saya telah mengubah model saya, membuat migrasi dengan schemamigration, menjalankan migrasi denganmigrate , dan sekarang saya menyadari bahwa itu bukan yang saya inginkan dan saya ingin kembali seperti sebelumnya.

Pendek mengedit tabel db secara manual dan menghapus file migrasi, bagaimana cara saya mengembalikan migrasi? Saya menemukan referensi untuk migrasi mundur menggunakan Selatan melalui Google, tetapi belum menemukan contoh kode yang solid untuk itu.

Adakah yang bisa membantu?

Ruiwen
sumber
Pertanyaan bagus!!
Marshall X

Jawaban:

335

Anda perlu mengetahui jumlah migrasi tepat sebelum yang ingin Anda putar kembali.

Aplikasi Anda harus memiliki direktori migrasi, dengan file-file di dalamnya bernama like

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

Biasanya, ketika Anda menjalankan ./manage.py migrate your_app, South menjalankan semua migrasi baru, secara berurutan. (Ini terlihat pada tabel database untuk memutuskan mana yang 'baru').

Namun, Anda juga dapat menentukan migrasi dengan angka, dan Selatan akan memigrasi basis data Anda, baik maju atau mundur , untuk membawanya ke titik itu. Jadi, dengan contoh file di atas, jika Anda telah bermigrasi hingga 0003, dan Anda ingin menjalankan 0003 secara terbalik (membatalkannya, secara efektif), Anda akan menjalankan

./manage.py migrate your_app 0002

Selatan akan melihat database, menyadari bahwa ia telah menjalankan 0003, dan menentukan bahwa ia harus menjalankan migrasi terbalik untuk 0003 untuk kembali ke 0002.

Ian Clelland
sumber
1
Sayangnya, ketika Anda membuat migrasi Anda berikutnya, itu tidak melewatkan yang di antaranya, jadi Anda hanya bermigrasi melalui mereka lagi nanti. Sepertinya ada cara yang lebih baik.
mlissner
44
@mlissner Jika Anda benar-benar ingin, setelah memutar kembali basis data, buka folder migrasi aplikasi yang diberikan (dalam contoh di atas your_app / migrasi) dan hapus migrasi yang tidak diinginkan
Josh Russo
1
Tepat - Selatan tidak pernah melewatkan migrasi; itu mengharapkan bahwa file dari 0001-nnnn mewakili set migrasi yang konsisten, untuk nilai nnnn. Jika bukan itu masalahnya, maka Anda perlu memesan ulang atau menghapus sendiri yang menyinggung.
Ian Clelland
217

Kalau-kalau ada seseorang (seperti saya) bertanya-tanya bagaimana cara bermigrasi dari awal (0001) :

django-admin.py migrate some_app zero

keluaran:

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

"nol" adalah keadaan khusus sebelum migrasi apa pun.

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

Ctrl-C
sumber
6
Seseorang menjalankan migrasi 0001 - palsu, dan ini adalah satu-satunya cara untuk menjalankan 0001 mundur. Terima kasih!
jmanning2k
1
Jawaban yang sangat penting, saya bertanya-tanya mengapa migrate 0000tidak berhasil. Tentang migrasi palsu, ya, Anda mungkin memerlukannya, jika misalnya Anda hanya perlu membatalkan migrasi awal (mungkin salah), tetapi sejarah migrasi berpikir, bahwa migrasi ini tidak pernah terjadi.
Tomasz Gandor
3

Tambahkan nama migrasi di akhir parameter:

./manage.py migrate app-name 00xx-migration-name
Jerzyk
sumber
2
Tidak apa-apa, dan saya pernah melakukannya sebelumnya, tetapi banyak mengetik / menempel. Angka "status" kosong - dalam hal ini 00xx- cukup. Saat meningkatkan dan menguji migrasi Anda dapat memiliki kedua perintah di riwayat: maju (tanpa argumen), mundur dengan nomor negara sebelumnya.
Tomasz Gandor