2010-04-13 13 views
5

Syncdb'nin, kendim tarafından tanımlanan SQL sorgularını (tablo oluşturma için) yürütmesini sağlayarak tabloları otomatik olarak oluşturur.Django'da, syncdb çalıştırıldığında bir SQL dosyasındaki tabloların nasıl oluşturulacağı

Uygulamamdaki bazı özel modeller, eski veritabanı tablosu için SQL tablo görünümlerini temsil ettiğinden, bu çözümü arıyorum. Bu yüzden django-DB'mdeki SQL görünümlerini şu şekilde oluşturdum:

CREATE VIEW legacy_series AS SELECT * legacy.series;

Yukarıdaki görünümü/eski kaliteyi temsil eden tersine tasarlanmış bir modelim var. Ama ne zaman syncdb çalıştırırsam, önce sql betikleri çalıştırarak tüm görünümleri oluşturmalıyım, aksi takdirde (sadece bir görünüm bulunmazsa) syncdb onlar için tablolar oluşturur.

Yukarıda belirtilen SQL'i nasıl çalıştırabilirim?

cevap

5

(olduğunu görüşlerini kullanmadan) Ben eski bir veritabanı tablosuna Modelleri adapte biliyor 2 olası yaklaşım vardır:

1) proje içinde piton manage.py inspectdb çalıştırın. Bu, varolan veritabanı tabloları için modeller oluşturacaktır, daha sonra bunlarla çalışmaya devam edebilirsiniz.

2) Masalarınızı belirli ayarlarla değiştirin. Her şeyden önce, meta seçeneklerinizde db_table seçeneğini ayarlayarak modelinizde tablo adını tanımlarsınız. İkinci olarak, her alan için db_column seçeneğini ayarlayarak eski veritabanınızı eşleştirmek için sütun adını tanımlarsınız. Eski veritabanınızı eşleştirmek için kullanabileceğiniz başka db_ seçeneklerinin bulunduğunu unutmayın.

Görünümlerin gerçekten çirkin bir yaklaşıma yaklaşmasını istiyorsanız, uygulama modeli başına custom sql commands tanımlayabilirsiniz. Bu dosya "application"/sql/"model" .sql dosyasında bulunur. Django, tüm tabloları oluşturduktan sonra bu sql'leri çağırır. Oluşturulan tablolar için DROP ifadelerini ve ardından bu dosyada görünüm oluşturma ifadenizi belirtmeyi deneyebilirsiniz. Django, bu dosyaların yürütme sırasını hiçbir şekilde garanti etmediğinden, bu durumun yabancı anahtarlı tablolar için biraz zor olacağına dikkat edin (böylece, birindeki tüm ifadelerin doldurulması .sql, düşündüğüm en kolay yol olacak, bunu daha önce hiç denemedim).

4

Ters mühendislik modelleriniz için unmanaged models ve görünümlerinizi oluşturmak için initial SQL scripts kullanabilirsiniz.

DÜZENLEME:

Biraz daha detaylı bir cevap. Yönetilmeyen modeller kullandığınızda, syncdb veritabanı tablolarınızı sizin için oluşturmayacaktır, bu yüzden kendinize dikkat etmeniz gerekir. Önemli bir nokta tablo adıdır ve tablo adlarına django Model sınıflarını nasıl eşleştiriyor? the doc on that point'u okumanızı öneririm.

Esas olarak, Series model, gibi görünecektir:

class Series(models.Model): 
    # model fields... 
    ... 

    class Meta: 
     managed = False 
     db_table = "legacy_series" 

Sonra yourapp/sql/series.sql dosyada, SQL komutları koyabilirsiniz: zamanki gibi

### yourapp/sql/series.sql 
CREATE VIEW legacy_series AS SELECT * FROM legacy.series; 

yapabilirsiniz o zaman syncdb ve Eski modellerinizi kullanmaya başlayın.

İlgili konular