inspectdb를 사용하여 리버스 엔지니어링 모델

이 문서에서는 Django의 inspectdb 관리 명령을 사용하여 기존 SQL Server 데이터베이스에서 모델 코드를 생성하는 방법을 설명합니다.

사전 요구 사항

settings.py에서 INSTALLED_APPSmssql을 추가합니다. 이 단계에서는 비기본 스키마를 검사하기 위한 --schema 플래그를 추가하는 inspectdb용 관리 명령 재정의 mssql-django를 등록합니다.

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

Note

데이터베이스 백 엔드는 mssql 이 단계 없이 작동합니다. INSTALLED_APPS"mssql"를 추가하는 것은 inspectdb에서 --schema 플래그를 활성화하는 데만 필요합니다. 이 스키마가 없으면 inspectdb 기본 스키마(dbo)만 검사합니다.

기본 사용법

구성된 데이터베이스의 모든 테이블에 대한 모델을 생성합니다.

python manage.py inspectdb

출력을 모델 파일에 직접 저장합니다.

python manage.py inspectdb > myapp/models.py

특정 테이블 검사

특정 테이블에 대한 모델만 생성합니다.

python manage.py inspectdb MyTable AnotherTable

다중 스키마 지원

백 엔드는 mssql-djangoinspectdb 여러 스키마를 지원하도록 확장됩니다. 플래그를 사용하여 스키마를 지정합니다.--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]"을 사용합니다. 백엔드는 db_table를 단일 식별자로 처리하므로 대괄호로 묶은 이름은 올바르게 유지되는 반면, 큰따옴표로 묶인 형식은 리터럴 테이블 이름으로 다시 따옴표 처리됩니다.

스키마 간 외래 키

두 테이블이 동일한 데이터베이스에 있고 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. Set managed = False: 생성된 모델에는 Meta 클래스에 managed = False가 포함되며, 이는 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

명령에 inspectdb 는 SQL Server 함께 사용할 때 다음과 같은 제한 사항이 있습니다.

복합 기본 키 검사

복합 기본 키가 있는 테이블은 전체 모델 정의를 생성하지 않을 수 있습니다. Django 5.2 이상에서는 inspectdb를 실행한 후 CompositePrimaryKey를 수동으로 정의하거나, 서로게이트 기본 키를 사용합니다.

Views

명령은 inspectdb 보기를 검사할 수 있지만 생성된 모델에는 필드 형식 및 null 제약 조건을 수동으로 조정해야 할 수 있습니다.