Visszafejtőgép-modellek az inspectdb használatával

Ez a cikk bemutatja, hogyan hozhat létre modellkódot egy meglévő SQL Server-adatbázisból a Django inspectdb felügyeleti parancsának használatával.

Prerequisites

Adja hozzá a(z) mssql elemet a(z) settings.py-beli INSTALLED_APPS eleméhez. Ez a lépés regisztrálja a inspectdb kezelőparancs mssql-django felülírását, amely hozzáadja a --schema kapcsolót a nem alapértelmezett sémák vizsgálatához:

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

Note

Az mssql adatbázis háttérrendszere ezen lépés nélkül működik. A(z) "mssql" hozzáadása a(z) INSTALLED_APPS elemhez csak a(z) --schema jelző engedélyezéséhez szükséges a(z) inspectdb esetében. Nélküle inspectdb csak az alapértelmezett sémát (dbo) vizsgálja meg.

Alapszintű használat

Modellek létrehozása a konfigurált adatbázisban lévő összes táblához:

python manage.py inspectdb

Mentse a kimenetet közvetlenül egy modellfájlba:

python manage.py inspectdb > myapp/models.py

Adott táblák vizsgálata

Csak adott táblákhoz hozzon létre modelleket:

python manage.py inspectdb MyTable AnotherTable

Többséma támogatása

A mssql-django háttérrendszer kibővíti a inspectdb rendszert, hogy több sémát is támogasson. Adjon meg egy sémát a --schema jelölővel:

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

Ez a funkció SQL Server olyan adatbázisok esetében hasznos, amelyek táblákat rendszereznek több séma között.

Több sémából származó modellek kezelése

Ha az adatbázis több sémát használ, a modell Meta osztályában a db_table használatával adja meg a tábla sémanévvel kiegészített nevét. Előfordulhat, hogy a inspectdb létrehozott modellek nem tartalmaznak sémaelőtagokat, ezért vegye fel őket manuálisan:

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

Használjon szögletes kétrészes nevet, például "[schema].[table]". A háttérrendszer egyetlen azonosítóként kezeli db_table , így a zárójeles nevek helyesen megmaradnak, míg a kettős idézőjelű űrlapok szó szerinti táblanévként vannak újra idézve.

Sémaközi idegen kulcsok

A Django a sémák közötti idegenkulcs-kapcsolatokat mindaddig követheti, amíg mindkét tábla ugyanabban az adatbázisban van, és az db_table értékek helyesen vannak beállítva:

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]"

A Django a ForeignKey értékét a hivatkozott modell db_table értéke alapján oldja fel, így a kapcsolati mezőn nincs szükség további sémabeállításra.

Létrehozott modellek áttekintése

A inspectdb parancs olyan modellkódot hoz létre, amely manuális módosításokat igényelhet:

  1. Beállítás managed = False: A létrehozott modellek belefoglalnak managed = False az Meta osztályba, ami azt jelenti, hogy a Django nem kezeli a táblázatsémát. Távolítsa el ezt a sort, ha azt szeretné, hogy a Django kezelje a tábla áttelepítéseit.

  2. Elsődleges kulcsok hozzáadása: Ha egy tábla nem rendelkezik észlelhető elsődleges kulccsal, előfordulhat, hogy inspectdb manuálisan kell hozzáadnia egyet.

  3. Kapcsolatmezők javítása: Előfordulhat, hogy az idegenkulcs-kapcsolatok kiigazításra szorulnak, különösen a sémaközi hivatkozások esetében.

Példa a létrehozott kimenetre:

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

A inspectdb parancs az alábbi korlátozásokkal rendelkezik a SQL Server használatakor.

Összetett elsődleges kulcs ellenőrzése

Előfordulhat, hogy az összetett elsődleges kulcsokkal rendelkező táblák nem hoznak létre teljes modelldefiníciókat. A Django 5.2-es és újabb verzióiban a inspectdb futtatása után kézzel definiálja a CompositePrimaryKey elemet, vagy használjon surrogate elsődleges kulcsot.

Views

A inspectdb parancs megvizsgálhatja a nézeteket, de a létrehozott modellekhez szükség lehet a mezőtípusok és a null kényszerek manuális módosítására.