Vytvářejte modely zpětným inženýrstvím pomocí inspectdb

Tento článek vysvětluje, jak pomocí příkazu pro správu Django inspectdb vygenerovat kód modelu z existující databáze SQL Server.

Předpoklady

Přidejte mssql do INSTALLED_APPS v settings.py. Tento krok zaregistruje přepsání příkazu pro správu mssql-django pro inspectdb, které přidá příznak --schema pro kontrolu jiných než výchozích schémat:

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 databáze funguje i bez tohoto kroku. Přidání "mssql" do INSTALLED_APPS je vyžadováno pouze k povolení příznaku --schema u inspectdb. Bez něj inspectdb zkontroluje pouze výchozí schéma (dbo).

Základní použití

Generování modelů pro všechny tabulky v nakonfigurované databázi:

python manage.py inspectdb

Výstup uložte přímo do souboru modelů:

python manage.py inspectdb > myapp/models.py

Kontrola konkrétních tabulek

Generování modelů pouze pro konkrétní tabulky:

python manage.py inspectdb MyTable AnotherTable

Podpora více schémat

Backend mssql-django rozšiřuje inspectdb tak, aby podporoval více schémat. Zadejte schéma s příznakem --schema :

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

Tato funkce je užitečná pro SQL Server databáze, které uspořádají tabulky napříč více schématy.

Práce s modely z více schémat

Pokud vaše databáze používá více schémat, použijte db_table ve třídě Meta modelu k určení tabulky pomocí názvu schématu. Vygenerované modely inspectdb nemusí obsahovat předpony schématu, proto je přidejte ručně:

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

Použijte dvoudílný název v závorkách, například "[schema].[table]". Backend považuje db_table za jediný identifikátor, takže názvy v závorkách zůstanou správně zachovány, zatímco podoby v dvojitých uvozovkách jsou znovu uzavřeny do uvozovek jako doslovný název tabulky.

Cizí klíče napříč schématy

Django může sledovat relace cizího klíče napříč schématy, pokud jsou obě tabulky ve stejné databázi a db_table hodnoty jsou správně nastavené:

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 určí ForeignKey podle hodnoty db_table odkazovaného modelu, takže u pole relace není potřeba žádná další konfigurace schématu.

Kontrola vygenerovaných modelů

Příkaz inspectdb vygeneruje kód modelu, který může vyžadovat ruční úpravy:

  1. Set managed = False: Generované modely zahrnují managed = False do Meta třídy, což znamená, že Django nespravuje schéma tabulky. Tento řádek odeberte, pokud chcete, aby Django spravil migrace pro tabulku.

  2. Přidání primárních klíčů: Pokud tabulka nemá primární klíč, který inspectdb dokáže rozpoznat, budete ho muset přidat ručně.

  3. Opravte pole relací: Relace založené na cizích klíčích mohou vyžadovat úpravy, zejména u odkazů mezi schématy.

Příklad vygenerovaného výstupu:

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"

Omezení

Příkaz inspectdb má následující omezení při použití s SQL Server.

Kontrola složeného primárního klíče

Tabulky s složenými primárními klíči nemusí generovat úplné definice modelu. V Django 5.2 a novějším definujte CompositePrimaryKey ručně po spuštění inspectdbnebo použijte náhradní primární klíč.

Views

Příkaz inspectdb může kontrolovat zobrazení, ale vygenerované modely můžou vyžadovat ruční úpravy typů polí a omezení null.