Saya telah mengakumulasikan beberapa migrasi menggunakan Selatan (0.7) dan Django (1.1.2) yang mulai menghabiskan cukup banyak waktu dalam pengujian unit saya. Saya ingin mengatur ulang baseline dan memulai set migrasi baru. Saya telah meninjau dokumentasi Selatan , melakukan pencarian Google / Stackoverflow seperti biasa (mis. "Django selatan (reset ATAU hapus ATAU hapus) riwayat migrasi") dan belum menemukan sesuatu yang jelas.
Satu pendekatan yang telah saya renungkan akan melibatkan "memulai kembali" dengan "menghapus" Selatan atau "menghapus" riwayat secara manual (mis. Kosongkan tabel db, hapus file migrasi dari direktur migrasi) dan jalankan kembali,
./manage.py schemamigration southtut --initial
Jadi, jika ada yang pernah melakukan ini sebelumnya dan memiliki beberapa tips / saran, mereka akan sangat dihargai.
sumber
__init__.py
keappname/migrations
./manage.py makemigrations
tetapi hal-hal buruk akan terjadi jika Anda tidak memulai dari db baru ...squashmigrations
itu jawaban yang tepatJawaban:
Pertama, sebuah jawaban oleh penulis Selatan :
Inilah yang saya lakukan di server produksi dev + saya ketika saya harus menyingkirkan semua migrasi dev yang tidak dibutuhkan ini:
* kecuali jika Anda ingin membersihkan hanya satu aplikasi di antara yang lain, jika demikian Anda perlu mengedit tabel south_history dan hanya menghapus entri tentang aplikasi Anda.
sumber
manage.py schemamigration app name --initial
alih-alih convert_to_south.south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
adalah berbahaya dan dapat merusak database jika ada aplikasi pihak ketiga yang menggunakan selatan dalam proyek, sebagai keluar menunjuk oleh @thnee bawah. Karena jawaban Anda memiliki begitu banyak upvotes, saya akan sangat menghargai jika Anda dapat mengeditnya dan menambahkan setidaknya peringatan tentang ini, atau (bahkan lebih baik) mengubahnya untuk mencerminkan pendekatan @hobs (yang sama mudahnya, tetapi tidak mempengaruhi aplikasi lain) - terima kasih!Jika Anda perlu mengatur ulang secara selektif (hanya untuk satu aplikasi) migrasi yang terlalu lama, ini berhasil bagi saya.
Jangan lupa untuk secara manual mengembalikan dependensi pada aplikasi lain dengan menambahkan baris seperti
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
ke<app-dir>/migrations/0001_initial.py
file Anda , sebagai atribut pertama di kelas migrasi Anda tepat di bawahclass Migration(SchemaMigration):
.Anda kemudian dapat
./manage.py migrate <app-name> --fake --delete-ghost-migrations
pada lingkungan lain, sesuai jawaban SO ini . Tentu saja jika Anda memalsukan penghapusan atau memalsukan,migrate zero
Anda harus menghapus secara manual setiap tabel db tersisa dengan migrasi seperti ini .Opsi yang lebih nuklir adalah
./manage.py migrate --fake --delete-ghost-migrations
pada server penyebaran langsung diikuti oleh sqldump [saya]. Kemudian pipa yang dibuang ke [my] sql pada lingkungan di mana Anda memerlukan migrasi, populasi penuh. Penistaan selatan, saya tahu, tetapi bekerja untuk saya.sumber
DependsOnUnknownMigration
lama berpura-pura memalsukan migrasi awal yang baru. Berkat komentar Anda, saya bisa mengetahui bahwa saya harus memperbaruidepends_on
pernyataan di mana pun itu merujuk ke aplikasi ini. Ini benar-benar jawaban terbaik di sini. Terima kasih! :)Berkat jawaban Dominique Guardiola dan hobs, ini membantu saya memecahkan masalah yang sulit. Namun ada beberapa masalah dengan solusinya, ini adalah pendapat saya.
Menggunakan
manage.py reset south
adalah bukan ide yang baik jika Anda memiliki aplikasi pihak ketiga yang menggunakan Selatan, misalnyadjango-cms
(pada dasarnya semua menggunakan Selatan).reset south
akan menghapus semua riwayat migrasi untuk semua aplikasi yang telah Anda instal.Sekarang perhatikan bahwa Anda meningkatkan ke versi terbaru
django-cms
, itu akan berisi migrasi baru seperti0009_do_something.py
. Selatan pasti akan bingung ketika Anda mencoba menjalankan migrasi itu tanpa harus0001
melalui0008
dalam sejarah migrasi.Jauh lebih baik / aman untuk hanya mereset hanya aplikasi yang Anda pertahankan secara selektif .
Pertama-tama, pastikan aplikasi Anda tidak memiliki desync antara migrasi pada disk, dan migrasi yang telah dijalankan pada database. Kalau tidak, akan ada sakit kepala.
1. Hapus riwayat migrasi untuk aplikasi saya
2. Hapus migrasi untuk aplikasi saya
3. Buat migrasi awal baru untuk aplikasi saya
4. Palsu melakukan migrasi awal untuk aplikasi saya
Ini memasukkan migrasi ke
south_migrationhistory
tanpa menyentuh tabel sebenarnya:Langkah 3 dan 4 sebenarnya hanya varian yang lebih lama
manage.py convert_to_south my_app
, tapi saya lebih suka kontrol ekstra itu, dalam situasi yang rumit seperti memodifikasi database produksi.sumber
./manage.py migrate --fake
jika Anda tidak ingin memalsukan migrasi aplikasi lain yang menunggu migrasi.Seperti thnee (lihat jawabannya), kami menggunakan pendekatan yang lebih lembut terhadap saran penulis Selatan (Andrew Godwin) yang dikutip di tempat lain di sini, dan kami memisahkan apa yang kami lakukan dengan basis kode dari apa yang kami lakukan ke database, selama penempatan , karena kami membutuhkan penyebaran agar dapat diulang:
Apa yang kami lakukan dalam kode:
Apa yang kami lakukan pada basis data setelah kode tersebut digunakan
sumber
Jika Anda hanya bekerja pada mesin dev, saya menulis perintah manajemen yang melakukan cukup banyak seperti yang disarankan Dominique.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
Berbeda dengan saran penulis selatan, ini TIDAK akan merusak aplikasi yang diinstal lainnya menggunakan selatan.
sumber
Mengikuti hanya jika Anda ingin mengatur ulang semua aplikasi. Harap cadangkan semua basis data Anda sebelum pekerjaan itu. Catat juga depend_on Anda di file awal jika ada.
Untuk sekali:
Uji bootstrap proyek Anda sebelum mendorong. Kemudian, untuk setiap mesin lokal / jarak jauh, terapkan sebagai berikut:
Lakukan inisial (3) untuk setiap aplikasi yang ingin Anda libatkan kembali. Perhatikan bahwa, reset (6) hanya akan menghapus riwayat migrasi, oleh karena itu tidak berbahaya bagi perpustakaan. Migrasi palsu (7) akan mengembalikan riwayat migrasi aplikasi pihak ketiga yang diinstal.
sumber
hapus file yang diperlukan dari folder aplikasi
jalur contoh
wiki -adalah aplikasi saya
sumber