Merekayasa balik model dengan inspectdb

Artikel ini menjelaskan cara menggunakan perintah manajemen Django inspectdb untuk menghasilkan kode model dari database SQL Server yang ada.

Prasyarat

Tambahkan mssql ke INSTALLED_APPS anda di settings.py. Langkah ini mendaftarkan penimpaan perintah manajemen mssql-django untuk inspectdb, yang menambahkan flag --schema untuk memeriksa skema non-default:

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

Note

Backend mssql database berfungsi tanpa langkah ini. Menambahkan "mssql" ke INSTALLED_APPS hanya diperlukan untuk mengaktifkan flag --schema pada inspectdb. Tanpa itu, inspectdb hanya memeriksa skema default (dbo).

Penggunaan dasar

Hasilkan model untuk semua tabel dalam database yang dikonfigurasi:

python manage.py inspectdb

Simpan output langsung ke file model:

python manage.py inspectdb > myapp/models.py

Memeriksa tabel tertentu

Hasilkan model hanya untuk tabel tertentu:

python manage.py inspectdb MyTable AnotherTable

Dukungan multiskema

Backend mssql-django memperluas inspectdb untuk mendukung beberapa skema. Tentukan skema dengan flag --schema:

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

Fitur ini berguna untuk database SQL Server yang mengatur tabel di beberapa skema.

Bekerja dengan model dari beberapa skema

Saat database Anda menggunakan beberapa skema, gunakan db_table di kelas model Meta untuk memenuhi syarat tabel dengan nama skemanya. Model yang dihasilkan dari inspectdb mungkin tidak menyertakan awalan skema, jadi tambahkan secara manual:

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

Gunakan nama dua bagian yang dikurung seperti "[schema].[table]". Backend memperlakukan db_table sebagai pengidentifikasi tunggal, sehingga nama yang dikurung dipertahankan dengan benar sementara formulir yang dikutip ganda dikutip kembali sebagai nama tabel harfiah.

Kunci asing antar skema

Django dapat mengikuti hubungan kunci asing di seluruh skema selama kedua tabel berada dalam database yang sama dan db_table nilai diatur dengan benar:

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 menentukan ForeignKey melalui nilai db_table dari model yang direferensikan, sehingga tidak diperlukan konfigurasi skema tambahan pada field relasi.

Meninjau model yang dihasilkan

Perintah ini inspectdb menghasilkan kode model yang mungkin memerlukan penyesuaian manual:

  1. Set managed = False: Model yang dihasilkan termasuk managed = False dalam Meta kelas , yang berarti Django tidak mengelola skema tabel. Hapus baris ini jika Anda ingin Django mengelola migrasi untuk tabel.

  2. Menambahkan kunci primer: Jika tabel tidak memiliki kunci utama yang inspectdb dapat dideteksi, Anda mungkin perlu menambahkannya secara manual.

  3. Memperbaiki bidang hubungan: Hubungan kunci asing mungkin memerlukan penyesuaian, terutama untuk referensi lintas skema.

Contoh output yang dihasilkan:

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"

Limitations

Perintah inspectdb memiliki batasan berikut saat digunakan dengan SQL Server.

Pemeriksaan kunci utama komposit

Tabel dengan kunci primer komposit mungkin tidak menghasilkan definisi model lengkap. Di Django 5.2 dan yang lebih baru, tentukan CompositePrimaryKey secara manual setelah menjalankan inspectdb, atau gunakan kunci primer pengganti.

Views

Perintah inspectdb dapat memeriksa tampilan, tetapi model yang dihasilkan mungkin memerlukan penyesuaian manual jenis bidang dan batasan null.