Django South ile geriye doğru göç


217

Tamam, bu sormak gerçekten aptalca bir şey gibi görünüyor ve eminim ki bir yerlerde bir şey eksik.

Django'da South'u kullanarak geriye doğru taşıma işlemini nasıl gerçekleştirirsiniz?

Bu yüzden modellerimi değiştirdim, bir taşıma oluşturdum, taşıma schemamigrationişlemini yürütüyorum migrateve şimdi bunun istediğim gibi olmadığını anlıyorum ve daha önce olmasını istiyorum.

Manuel olarak db tablolarını düzenleme ve taşıma dosyalarını kaldırma, taşıma geri alma hakkında nasıl gitmeliyim? Google üzerinden Güney'i kullanan geriye doğru geçişlere referanslar buluyorum, ancak bunun için sağlam bir kod örneği bulamadım.

Biri yardım edebilir mi?


iyi soru!!
Marshall X

Yanıtlar:


335

Taşıma sayısını geri almak istediğinizden hemen önce bulmanız gerekir.

Uygulamanızda, dosyaları şöyle adlandırılmış bir taşıma dizini olmalıdır

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

Normalde, koştuğunuzda ./manage.py migrate your_app, Güney tüm yeni göçleri sırayla yürütür. (Hangilerinin 'yeni' olduğuna karar vermek için veritabanı tablolarına bakar).

Ancak, aynı zamanda sayısına göre herhangi göçünü belirtebilirsiniz ve Güney için veritabanı geçiş olacak ya ileri ya da geri o noktaya almak. Dolayısıyla, yukarıdaki örnek dosyalarla, 0003'e kadar taşındıysanız ve 0003'ü tersine (etkin bir şekilde geri almak,) geri almak istiyorsanız,

./manage.py migrate your_app 0002

South veritabanına bakar, 0003'ü zaten çalıştırdığını fark eder ve 0002'ye geri dönmek için 0003 için ters geçişi çalıştırması gerektiğini belirler.


1
Ne yazık ki, bir sonraki geçişinizi oluşturduğunuzda, aradaki geçişleri atlamaz, bu nedenle daha sonra tekrar geçiş yaparsınız. Daha iyi bir yol olabilir gibi görünüyor.
mlissner

44
@mlissner Gerçekten istiyorsanız, veritabanını geri aldıktan sonra, verilen uygulamanın geçişler klasörüne gidin (yukarıdaki örnekte uygulamanız / geçişleriniz) ve istenmeyen geçişi silin
Josh Russo

1
Tam olarak - Güney asla göçleri atlamaz; 0001-nnnn dosyalarının herhangi bir nnnn değeri için tutarlı bir taşıma kümesini temsil etmesini bekler. Durum böyle değilse, rahatsız edici olanları kendiniz yeniden sipariş etmeniz veya silmeniz gerekir.
Ian Clelland

217

Birisinin (benim gibi) ilkinden nasıl geri döneceğini merak etmesi durumunda (0001) :

django-admin.py migrate some_app zero

çıktı:

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

"Sıfır", herhangi bir geçişten önceki özel bir durumdur.

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


6
Birisi 0001 -fake göç etti ve 0001'i geriye doğru çalıştırmanın tek yolu buydu. Teşekkürler!
jmanning2k

1
Çok önemli bir cevap, neden migrate 0000işe yaramadığını merak ettim . Sahte göç hakkında, evet, örneğin ilk göçü (muhtemelen yanlış) geri almanız gerekiyorsa, ancak göç geçmişi bu göçün asla gerçekleşmediğini düşünüyorsa buna ihtiyacınız olabilir.
Tomasz Gandor

3

Parametrelerin sonuna bir taşıma adı ekleyin:

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

2
Tamam, ve daha önce yaptım, ama bir sürü yazma / yapıştırma. Çıplak "durum" numarası - bu durumda 00xx- yeterlidir. Bir taşımayı iyileştirirken ve test ederken, geçmişte her iki komutu da kullanabilirsiniz: ileri (bağımsız değişken yok), önceki durum numarasıyla geriye doğru.
Tomasz Gandor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.