Reverse Engineering-Modelle mit inspectdb

In diesem Artikel wird erläutert, wie Sie den Verwaltungsbefehl von inspectdb Django verwenden, um Modellcode aus einer vorhandenen SQL Server-Datenbank zu generieren.

Voraussetzungen

Fügen Sie mssql zu Ihrem INSTALLED_APPS in settings.py hinzu. In diesem Schritt wird die Überschreibung des Management-Befehls mssql-django für inspectdb registriert, die das Flag --schema zum Prüfen nicht standardmäßiger Schemas hinzufügt:

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

Note

Das mssql Datenbank-Back-End funktioniert ohne diesen Schritt. Das Hinzufügen von "mssql" zu INSTALLED_APPS ist nur erforderlich, um das --schema-Flag für inspectdb zu aktivieren. Ohne das inspectdb Schema wird nur das Standardschema (dbo) überprüft.

Grundlegende Nutzung

Generieren Sie Modelle für alle Tabellen in der konfigurierten Datenbank:

python manage.py inspectdb

Speichern Sie die Ausgabe direkt in einer Modelldatei:

python manage.py inspectdb > myapp/models.py

Überprüfen bestimmter Tabellen

Generieren Sie Modelle nur für bestimmte Tabellen:

python manage.py inspectdb MyTable AnotherTable

Unterstützung für mehrere Schemas

Das mssql-django Backend erweitert inspectdb, um mehrere Schemas zu unterstützen. Geben Sie ein Schema mit der --schema Kennzeichnung an:

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

Dieses Feature ist nützlich für SQL Server Datenbanken, die Tabellen über mehrere Schemas hinweg organisieren.

Arbeiten mit Modellen aus mehreren Schemas

Wenn Ihre Datenbank mehrere Schemas verwendet, verwenden Sie db_table in der Meta-Klasse des Modells, um den Tabellennamen mit dem Namen des Schemas zu qualifizieren. Generierte Modelle aus inspectdb können keine Schemapräfixe enthalten. Fügen Sie sie daher manuell hinzu:

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

Verwenden Sie einen in spitze Klammern gesetzten zweiteiligen Namen wie "[schema].[table]". Das Backend behandelt db_table als einen einzelnen Bezeichner, sodass in Klammern gesetzte Namen korrekt beibehalten werden, während in doppelte Anführungszeichen gesetzte Formen erneut als wörtlicher Tabellenname in Anführungszeichen gesetzt werden.

Schemaübergreifende Fremdschlüssel

Django kann Fremdschlüsselbeziehungen über Schemas hinweg verfolgen, solange sich beide Tabellen in derselben Datenbank befinden und die db_table Werte richtig festgelegt werden:

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 ermittelt ForeignKey über den Wert db_table des referenzierten Modells, sodass für das Beziehungsfeld keine zusätzliche Schemakonfiguration erforderlich ist.

Überprüfen generierter Modelle

Der inspectdb Befehl generiert Modellcode, der möglicherweise manuelle Anpassungen benötigt:

  1. Set managed = False: Generierte Modelle enthalten managed = False in der Klasse Meta, was bedeutet, dass das Tabellenschema von Django nicht verwaltet wird. Entfernen Sie diese Zeile, wenn Django Migrationen für die Tabelle verwalten soll.

  2. Hinzufügen von Primärschlüsseln: Wenn eine Tabelle keinen Primärschlüssel enthält, der inspectdb erkannt werden kann, müssen Sie möglicherweise einen manuell hinzufügen.

  3. Beziehungsfelder korrigieren: Fremdschlüsselbeziehungen müssen möglicherweise angepasst werden, insbesondere bei schemaübergreifenden Verweisen.

Beispiel für die generierte Ausgabe:

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"

Einschränkungen

Der inspectdb Befehl hat die folgenden Einschränkungen, wenn er mit SQL Server verwendet wird.

Zusammengesetzte Primärschlüsselüberprüfung

Tabellen mit zusammengesetzten Primärschlüsseln generieren möglicherweise keine vollständigen Modelldefinitionen. Definieren Sie CompositePrimaryKey in Django 5.2 und höher manuell nach dem Ausführen inspectdboder verwenden Sie einen Ersatz-Primärschlüssel.

Views

Der inspectdb Befehl kann Ansichten prüfen, aber die generierten Modelle erfordern möglicherweise eine manuelle Anpassung von Feldtypen und NULL-Einschränkungen.