Inspectdb ile ters mühendislik modelleri

Bu makalede, mevcut bir SQL Server veritabanından model kodu oluşturmak için Django'nun inspectdb yönetim komutunun nasıl kullanılacağı açıklanmaktadır.

Prerequisites

settings.py içindeki INSTALLED_APPS öğenize mssql ekleyin. Bu adım, varsayılan olmayan şemaları incelemek için --schema bayrağını ekleyen inspectdb için mssql-django yönetim komutu geçersiz kılmasını kaydeder:

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "mssql",
    "myapp",
]

Note

Veritabanı mssql arka ucu bu adım olmadan çalışır. "mssql" öğesinin INSTALLED_APPS öğesine eklenmesi yalnızca inspectdb üzerinde --schema bayrağını etkinleştirmek için gereklidir. Bu olmadan, inspectdb yalnızca varsayılan şemayı (dbo) inceler.

Temel kullanım

Yapılandırılan veritabanındaki tüm tablolar için modeller oluşturun:

python manage.py inspectdb

Çıkışı doğrudan bir model dosyasına kaydedin:

python manage.py inspectdb > myapp/models.py

Belirli tabloları inceleme

Yalnızca belirli tablolar için modeller oluşturun:

python manage.py inspectdb MyTable AnotherTable

Çoklu şema desteği

mssql-django arka uç, birden çok şemayı desteklemek için inspectdb öğesini genişletir. Bayrağı olan --schema bir şema belirtin:

python manage.py inspectdb --schema "dbo"
python manage.py inspectdb --schema "sales"

Bu özellik, tabloları birden çok şemada düzenleyen SQL Server veritabanları için kullanışlıdır.

Birden çok şemadan modellerle çalışma

Veritabanınız birden çok şema kullandığında, tabloyu şema adıyla nitelemek için modelin db_table sınıfında kullanınMeta. oluşturulan inspectdb modeller şema ön ekleri içermeyebilir, bu nedenle bunları el ile ekleyin:

class Customer(models.Model):
    customer_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)

    class Meta:
        managed = False
        db_table = "[sales].[Customer]"

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        managed = False
        db_table = "[inventory].[Product]"

Important

"[schema].[table]" gibi köşeli ayraç içine alınmış iki parçalı bir ad kullanın. Arka uç, db_table ifadesini tek bir tanımlayıcı olarak ele alır; bu nedenle köşeli ayraç içindeki adlar doğru şekilde korunurken, çift tırnaklı biçimler sabit bir tablo adı olarak yeniden çift tırnak içine alınır.

Şemalar arası yabancı anahtarlar

Django, her iki tablo da aynı veritabanında olduğu ve db_table değerler doğru ayarlandığı sürece şemalar arasında yabancı anahtar ilişkilerini izleyebilir:

class OrderItem(models.Model):
    order_item_id = models.AutoField(primary_key=True)
    product = models.ForeignKey("Product", on_delete=models.CASCADE)
    quantity = models.IntegerField()

    class Meta:
        managed = False
        db_table = "[sales].[OrderItem]"

Django, başvurulan modelin ForeignKey değeri aracılığıyla çözümlendiğinden db_table ilişki alanında ek şema yapılandırması gerekmez.

Oluşturulan modelleri gözden geçirme

inspectdb komutu, el ile düzeltmeler gerektirebilecek model kodu oluşturur:

  1. Setmanaged = False: Oluşturulan modeller sınıfına managed = False dahildirMeta; bu da Django'nun tablo şemasını yönetmediği anlamına gelir. Tablonun geçişlerini Django'nın yönetmesini istiyorsanız bu satırı kaldırın.

  2. Birincil anahtar ekleme: Tabloda algılayabileceğiniz bir birincil anahtar inspectdb yoksa, el ile eklemeniz gerekebilir.

  3. İlişki alanlarını düzeltin: Yabancı anahtar ilişkileri, özellikle şemalar arası referanslarda, ayarlanmayı gerektirebilir.

Oluşturulan çıktı örneği:

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = "Product"

Sınırlamalar

komut, inspectdb SQL Server ile kullanıldığında aşağıdaki sınırlamalara sahiptir.

Bileşik birincil anahtar denetimi

Bileşik birincil anahtarlara sahip tablolar tam model tanımları oluşturmayabilir. Django 5.2 ve sonraki sürümlerde, inspectdb komutunu çalıştırdıktan sonra CompositePrimaryKey öğesini el ile tanımlayın veya vekil birincil anahtar kullanın.

Views

Komut inspectdb görünümleri inceleyebilir, ancak oluşturulan modeller alan türlerinin ve null kısıtlamaların el ile ayarlanmasını gerektirebilir.