Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
Set
managed = False: Generované modely zahrnujímanaged = FalsedoMetatřídy, což znamená, že Django nespravuje schéma tabulky. Tento řádek odeberte, pokud chcete, aby Django spravil migrace pro tabulku.Přidání primárních klíčů: Pokud tabulka nemá primární klíč, který
inspectdbdokáže rozpoznat, budete ho muset přidat ručně.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.