inspectdb を使用してモデルをリバース エンジニアリングする

この記事では、Django の inspectdb 管理コマンドを使用して、既存のSQL Server データベースからモデル コードを生成する方法について説明します。

Prerequisites

settings.pymssqlINSTALLED_APPSに追加します。 この手順では、mssql-djangoinspectdb管理コマンドのオーバーライドを登録します。これにより、既定以外のスキーマを検査するための--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の追加は、--schemainspectdb フラグを有効にするためにのみ必要です。 これを指定しない場合、 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 コマンドは、手動で調整が必要になる可能性があるモデル コードを生成します。

  1. managed = False設定: 生成されたモデルには、managed = False クラスにMetaが含まれます。つまり、Django はテーブル スキーマを管理しません。 Django でテーブルの移行を管理する場合は、この行を削除します。

  2. 主キーの追加: テーブルに、 inspectdb が検出できる主キーがない場合は、手動でキーを追加する必要がある場合があります。

  3. リレーションシップ フィールドを修正する: 外部キー リレーションシップでは、特にスキーマ間参照の調整が必要になる場合があります。

生成された出力の例:

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 制約を手動で調整する必要があります。