Models reverse-engineeren met inspectdb

In dit artikel wordt uitgelegd hoe u de beheeropdracht van inspectdb Django gebruikt om modelcode te genereren op basis van een bestaande SQL Server-database.

Prerequisites

Voeg mssql toe aan uw INSTALLED_APPS in settings.py. Met deze stap wordt de overschrijving van de managementopdracht mssql-django voor inspectdb geregistreerd, waarmee de vlag --schema wordt toegevoegd voor het inspecteren van niet-standaardschema’s:

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

Note

De back-end van de mssql database werkt zonder deze stap. Toevoegen "mssql" aan INSTALLED_APPS is alleen vereist om de --schema vlag in te schakelen op inspectdb. Zonder dit schema controleert inspectdb u alleen het standaardschema (dbo).

Basaal gebruik

Modellen genereren voor alle tabellen in de geconfigureerde database:

python manage.py inspectdb

Sla de uitvoer rechtstreeks op in een modelbestand:

python manage.py inspectdb > myapp/models.py

Specifieke tabellen inspecteren

Alleen modellen genereren voor specifieke tabellen:

python manage.py inspectdb MyTable AnotherTable

Ondersteuning voor meerdere schema's

De mssql-django back-end breidt inspectdb uit om meerdere schema's te ondersteunen. Geef een schema op met de --schema vlag:

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

Deze functie is handig voor SQL Server databases die tabellen in meerdere schema's organiseren.

Werken met modellen uit meerdere schema's

Wanneer uw database meerdere schema's gebruikt, gebruikt u db_table in de Meta-klasse van het model om de tabel te kwalificeren met de schemanaam. Gegenereerde modellen van inspectdb bevatten mogelijk geen schemavoorvoegsels, dus voeg ze handmatig toe:

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

Gebruik een tweedelige naam tussen haakjes, zoals "[schema].[table]". De backend behandelt db_table als één enkele identifier, zodat namen tussen blokhaken correct behouden blijven, terwijl namen tussen dubbele aanhalingstekens opnieuw tussen aanhalingstekens worden geplaatst als een letterlijke tabelnaam.

Vreemde sleutels tussen schema’s

Django kan relaties tussen refererende sleutels in schema's volgen zolang beide tabellen zich in dezelfde database bevinden en de db_table waarden correct zijn ingesteld:

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 lost de waarde van het ForeignKey model op via de waarde van db_table het verwijzingsmodel, dus er is geen extra schemaconfiguratie nodig in het relatieveld.

Gegenereerde modellen beoordelen

Met de inspectdb opdracht wordt modelcode gegenereerd die mogelijk handmatige aanpassingen nodig heeft:

  1. Set managed = False: Gegenereerde modellen bevatten managed = False in de klasse Meta, wat betekent dat Django het schema van de tabel niet beheert. Verwijder deze regel als u wilt dat Django migraties voor de tabel beheert.

  2. Primaire sleutels toevoegen: als een tabel geen primaire sleutel heeft die inspectdb kan worden gedetecteerd, moet u er mogelijk handmatig een toevoegen.

  3. Relatievelden herstellen: relaties met refererende sleutels moeten mogelijk worden aangepast, met name voor verwijzingen tussen schema's.

Voorbeeld van gegenereerde uitvoer:

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

De inspectdb opdracht heeft de volgende beperkingen bij gebruik met SQL Server.

Inspectie van de samengestelde primaire sleutel

Tabellen met samengestelde primaire sleutels genereren mogelijk geen volledige modeldefinities. Definieer CompositePrimaryKey in Django 5.2 en hoger handmatig na het uitvoeren inspectdbof gebruik een surrogaat primaire sleutel.

Views

De inspectdb opdracht kan weergaven inspecteren, maar de gegenereerde modellen vereisen mogelijk handmatige aanpassing van veldtypen en null-beperkingen.