django syncdb ve güncellenmiş bir model


86

Kısa süre önce modelimi güncelledim, ona bir BooleanField ekledim ancak yaptığımda model python manage.py syncdbiçin yeni alanı veritabanına eklemiyor . Bunu nasıl düzeltebilirim?


17
Django'nun kutudan çıkan bu kadar temel bir şeyi desteklememesi gerçeği, onu model oluşturmak için kullanmamı engelledi. Tablo oluşturmayı yöneten ancak (yerinde) tablo değişikliğini değil (yerinde) bir ORM'yi sürüm kalitesi olarak görmeleri beni Django'yu neredeyse tamamen kullanmaktan alıkoydu.
Glenn Maynard

3
Django'nun böylesine harika bir uygulama takılabilirliğine izin vermesi, Django'yu harika kılıyor ve tablo değişikliği için yerleşik destek eksikliğini temelde alakasız hale getiriyor. Bir uygulamayı yüklemek ne kadar zor?
Dominic Rodger

@Glenn, tasarım aşamasında modellerini doğru planla ve bu problemi yaşamazsın. Yeni özellikler ekliyorsanız, Güney gibi bir geçiş paketi kullanın. Yerinde geçişler genellikle karmaşıktır; zaten basit bir Django yönetim komutu için fazlasıyla karmaşık.
Soviut

Yanıtlar:


100

Django 1.7'den itibaren

Django, geçişler için yerleşik desteğe sahiptir - belgelere bir göz atın .

Django 1.6 ve öncesi için

Django, kullanıma hazır geçişleri desteklemez. Django için tam olarak bunu yapan takılabilir bir uygulama var ve harika çalışıyor. Adı Güney .


1
Not: Özel bir db arka uçlu modelleri taşımak için Güney'i kullanırken sorun yaşadım (django-mssql gibi)
Don

1
Güney çok çok güzel! Tavsiyen için teşekkürler
Julien Greard

14

Django şu anda bunu otomatik olarak yapmıyor. Seçenekleriniz:

  1. Tabloyu veritabanından bırakın, ardından syncdb kullanarak yeni biçimde yeniden oluşturun.
  2. Kullanarak veritabanı için SQL yazdırın python manage.py sql (appname), alan için eklenen satırı bulun ve alter tableSQL komutunu kullanarak manuel olarak ekleyin . (Bu aynı zamanda mevcut kayıtlarınız için alan değerlerini seçmenize de izin verecektir.)
  3. Güney'i kullanın ( Dominic'in cevabına göre ).

11

Bu adımları takip et:

  1. Dumpdata management komutunu kullanarak verilerinizi bir fikstüre aktarın
  2. Masayı bırak
  3. Syncdb'yi çalıştır
  4. Loaddata management komutunu kullanarak verilerinizi fikstürden yeniden yükleyin

Yerinde yapılması gereken bir şey için tam bir düşüş ve yeniden yükleme? Bu korkunç.
Glenn Maynard

3
Bu basit bir yönetim komutu, bir geçiş paketi değil! Django'nun verilerinizin nasıl değiştiğini veya nasıl korunacağını tahmin etmenin bir yolu yoktur, bu yüzden kendiniz yapmanız için ısrar eder. Beğenmediyseniz, Güney gibi bir taşıma aracı kullanın.
Soviut

8

En iyi yanıtta önerildiği gibi, Güney'i kullanmayı denedim ve belirsiz geçiş hatalarından kaynaklanan bir saatlik hayal kırıklığından sonra bunun yerine Django Evolution ile gitmeye karar verdim .

Sanırım başlamak Güney'e göre daha kolay ve ilk yazdığımda mükemmel çalıştı ./manage.py evolve --hint --execute, bu yüzden bundan memnunum.


7
Yaklaşık bir yıldır Django Evolution ve South'u kullandıktan sonra fikrimi değiştiriyorum. Güney harika. Ama nasıl çalıştığını gerçekten anladığınızdan emin olmanız gerektiği anlamda Git'e çok benziyor . Körü körüne komut yazıyorsanız, büyük olasılıkla siz veya ekibinizdeki biri hata yaptığında ilk kez hata yaparsınız.
Dan Abramov

2

Havent bir süre django kullandı, ancak syncdb'nin db tablolarında komutları değiştirdiğini hatırlıyorum. Tabloyu bırakmanız ve ardından tekrar çalıştırmanız gerekir ve yeniden oluşturulur.

edit: üzgünüm değişiklik YAPMAZ.


O zaman alter tablekomutları çalıştırmıyor, create tablekomutları çalıştırıyor .
Dominic Rodger

db'de verilerim var, bu yüzden bu sorunu bırakmadan üstesinden gelirsem harika olur.
Hellnar

1
Sanırım şunu söylemek istediniz, syncdb komutları DEĞİŞTİRMEZ. Tabloyu düşürmenize gerek yok, yeni alanı elle de sql'nize ekleyebilirsiniz.
Odif Yltsaeb

evet, ancak soru syncdb kullanımına atıfta bulunuyordu, bu nedenle bu durumda syncdb kullanmak veya aşağıda belirtilen eklentiyi kullanmak için tabloyu kaldırmanız gerekir.
Alex H

1
Güney konusunda hayal kırıklığı yaşıyorsanız, bunun yerine Django Evolution'ı deneyin. Benim için iyi çalıştı. stackoverflow.com/questions/1605662/…
Dan Abramov

1

Django 1.6'da

  • İlk başta koştuk - python manage.py sql <app name>

  • O zaman koşmalıyız - python manage.py syncdb


0

Django'yu Apache ve MySQL ile çalıştırırsanız, makemigrations ile geçiş yaptıktan sonra apache'yi yeniden başlatın .

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.