この記事では、Django の inspectdb 管理コマンドを使用して、既存のSQL Server データベースからモデル コードを生成する方法について説明します。
Prerequisites
settings.pyでmssqlをINSTALLED_APPSに追加します。 この手順では、mssql-djangoのinspectdb管理コマンドのオーバーライドを登録します。これにより、既定以外のスキーマを検査するための--schema フラグが追加されます。
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"mssql",
"myapp",
]
Note
mssql データベース バックエンドは、この手順なしで動作します。
"mssql"へのINSTALLED_APPSの追加は、--schemaでinspectdb フラグを有効にするためにのみ必要です。 これを指定しない場合、 inspectdb は既定のスキーマ (dbo) のみを検査します。
基本的な使用方法
構成されたデータベース内のすべてのテーブルのモデルを生成します。
python manage.py inspectdb
出力をモデル ファイルに直接保存します。
python manage.py inspectdb > myapp/models.py
特定のテーブルを検査する
特定のテーブルのみのモデルを生成します。
python manage.py inspectdb MyTable AnotherTable
複数スキーマのサポート
mssql-django バックエンドは、複数のスキーマをサポートするためにinspectdbを拡張します。
--schema フラグを使用してスキーマを指定します。
python manage.py inspectdb --schema "dbo"
python manage.py inspectdb --schema "sales"
この機能は、複数のスキーマにわたってテーブルを整理するSQL Serverデータベースに役立ちます。
複数のスキーマのモデルを操作する
データベースで複数のスキーマを使用する場合は、モデルのdb_table クラスのMetaを使用して、テーブルをスキーマ名で修飾します。
inspectdbから生成されたモデルにはスキーマ プレフィックスが含まれていない可能性があるため、手動で追加します。
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
"[schema].[table]"などの角かっこで囲まれた 2 部構成の名前を使用します。 バックエンドは db_table を 1 つの識別子として扱うので、角かっこで囲まれた名前は正しく保持されますが、二重引用符で囲まれたフォームはリテラル テーブル名として再引用符で囲まれます。
スキーマ間の外部キー
両方のテーブルが同じデータベースにあり、 db_table 値が正しく設定されている限り、Django はスキーマ間の外部キーリレーションシップに従うことができます。
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 は参照先モデルのForeignKey値を使用してdb_tableを解決するため、リレーションシップ フィールドに追加のスキーマ構成は必要ありません。
生成されたモデルを確認する
inspectdb コマンドは、手動で調整が必要になる可能性があるモデル コードを生成します。
managed = False設定: 生成されたモデルには、managed = FalseクラスにMetaが含まれます。つまり、Django はテーブル スキーマを管理しません。 Django でテーブルの移行を管理する場合は、この行を削除します。主キーの追加: テーブルに、
inspectdbが検出できる主キーがない場合は、手動でキーを追加する必要がある場合があります。リレーションシップ フィールドを修正する: 外部キー リレーションシップでは、特にスキーマ間参照の調整が必要になる場合があります。
生成された出力の例:
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
SQL Serverで使用する場合、inspectdb コマンドには次の制限があります。
複合主キーの確認
複合主キーを持つテーブルでは、完全なモデル定義が生成されない場合があります。 Django 5.2 以降では、CompositePrimaryKeyの実行後にinspectdbを手動で定義するか、サロゲート主キーを使用します。
Views
inspectdb コマンドはビューを検査できますが、生成されたモデルではフィールド型と null 制約を手動で調整する必要があります。