이 문서에서는 Django의 inspectdb 관리 명령을 사용하여 기존 SQL Server 데이터베이스에서 모델 코드를 생성하는 방법을 설명합니다.
사전 요구 사항
settings.py에서 INSTALLED_APPS에 mssql을 추가합니다. 이 단계에서는 비기본 스키마를 검사하기 위한 --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 명령은 수동 조정이 필요할 수 있는 모델 코드를 생성합니다.
Set
managed = False: 생성된 모델에는Meta클래스에managed = False가 포함되며, 이는 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
명령에 inspectdb 는 SQL Server 함께 사용할 때 다음과 같은 제한 사항이 있습니다.
복합 기본 키 검사
복합 기본 키가 있는 테이블은 전체 모델 정의를 생성하지 않을 수 있습니다. Django 5.2 이상에서는 inspectdb를 실행한 후 CompositePrimaryKey를 수동으로 정의하거나, 서로게이트 기본 키를 사용합니다.
Views
명령은 inspectdb 보기를 검사할 수 있지만 생성된 모델에는 필드 형식 및 null 제약 조건을 수동으로 조정해야 할 수 있습니다.