mssql-django의 제한 및 지원되지 않는 기능

이 글에서는 SQL Server, Azure SQL Database, Azure SQL Managed Instance, Microsoft Fabric 내 SQL 데이터베이스와 함께 백엔드 mssql-django 를 사용할 때의 한계를 나열합니다.

Django 기능 제한

다음 Django 기능들은 백엔드에서 mssql-django 지원되지 않거나 제한적으로 지원됩니다:

특징 상태 Details
AvgDurationField 지원되지 않음 집합은 AvgDurationField.
__regex 그리고 __iregex 조회 설정 필요 SQL Server 또는 Azure SQL Managed Instance에 CLR 어셈블리를 설치한 후 지원됩니다. Azure SQL Database는 CLR 어셈블리를 지원하지 않습니다. 정규 표현식 조회 설정을 참고하세요.
DISTINCT ON 지원되지 않음 SQL Server는 절을 지원 DISTINCT ON 하지 않습니다. 사용 .values().distinct() 법이나 하위 쿼리.
Subquery에서 ORDER BY 지원되지 않음 하위 쿼리 표현식으로 정렬하는 것은 작동하지 않을 수 있습니다.
데이터베이스 수준 CASCADE Limited 일부 SET NULL 운영은 SET DEFAULT 수동 마이그레이션 SQL을 요구할 수 있습니다.
is_dst Trunc / Extract 지원되지 않음 is_dst 매개변수(일광 절약 시간 전환 중 모호한 시간을 해결하기 위해 사용됨)는 지원 Extract()Trunc() 되지 않습니다. DST 인식 쿼리에 원시 SQL로 사용 AT TIME ZONE 하세요.
부동소수점 주석 Limited 부동소수점 Avg 집합은 SQL Server의 float 타입 동작 때문에 PostgreSQL에 비해 정밀도가 떨어질 수 있습니다. 예를 들어, 0.1과 0.2를 평균하면 정확히 0.15가 아니라 0.15000000000000000222가 나올 수 있습니다. 중요한 재무 계산을 위해 사용 DecimalField 하거나 Cast(avg_expr, output_field=DecimalField()) 활용하세요.
주석/존재 ORDER BY 지원되지 않음 주석 처리나 존재 표현식을 사용하는 것은 order_by 효과가 없을 수 있습니다.
오른손 거듭제곱과 날짜 연산 지원되지 않음 오른손 전차 연산(예: F('value') ** 2 작동하지만 2 ** F('value') 실패)과 나 timedelta 눗셈은 지원되지 않습니다.
시간대와 시간차(timedelta) Limited 시간대와 시간차는 완전히 지원되지 않습니다. mssql-django의 시간대 지원을 참고하세요.
NthValue 윈도우 기능 지원되지 않음 SQL Server는 .NTH_VALUE() , , LAST_VALUE또는 하위 쿼리를 사용FIRST_VALUE하세요.
ignore_conflicts에서 bulk_create 지원되지 않음 bulk_create(objs, ignore_conflicts=True)는 지원되지 않습니다. SQL Server는 PostgreSQLON CONFLICT DO NOTHING과 동등한 기능이 없습니다.
JSONField contains lookup 지원되지 않음 대신 키 경로 조회를 사용하세요(예: filter(metadata__color="blue")). JSONField 제한 사항을 참조하세요.
select_for_update(of=(...)) 지원되지 않음 SQL Server는 특정 테이블을 잠그는 것을 지원하지 않습니다. 백엔드는 NotSupportedError. 트랜잭션 관리를 참조하세요.

마이그레이션 제한 사항

Limitation Details
알터 AutoField 필드를 (IDENTITY 열)로 또는 에서 변경할 AutoField 수 없습니다. 새 테이블을 만들어야 합니다.
외래 키로 이름 변경 외래 키 제약 조건이 있는 열의 이름을 바꾸는 것은 실패할 수 있습니다. SeparateDatabaseAndState을 사용합니다.
AddConstraint / RemoveConstraint 갈등 일부 제약 연산은 충돌할 수 있습니다. 별도의 마이그레이션으로 지원하세요.
날짜 추출 연산 ExtractYear, ExtractMonth, 그리고 유사한 연산들은 제한된 tzinfo 지원을 제공합니다.

JSONField 제한사항

  • mssql-django Nvarchar(Max)와의 지도 JSONField 들. SQL Server 2025는 네이티브 json 타입을 도입했지만, Microsoft ODBC Driver for SQL Server에서는 이를 노출하지 않습니다.
  • 조회는 contains 지원되지 않습니다. 대신 키 경로 조회를 사용하세요(예: filter(metadata__color="blue")).
  • 따옴표가 붙은 문자열 값은 추가 따옴표를 붙여 반환합니다(예 '"value"''value': ).
  • 일부 중첩 조회는 PostgreSQL과 다르게 동작할 수 있습니다.
  • 자세한 내용은 SQL Server와 함께하는 JSONField를 참조하세요.

InspectDB 제한 사항

  • 컴포지트 기본 키는 자동으로 생성 unique_together 되지 않습니다.
  • 일부 SQL Server 전용 컬럼 타입은 일반적인 Django 필드로 매핑될 수 있습니다.
  • 생성된 모델을 수동으로 검토하고 조정하세요.
  • 자세한 내용은 inspectdb를 이용한 역설계 모델을 참조하세요.

SQL Server 매개변수 제한

SQL Server는 각 쿼리를 최대 2,100개의 매개변수로 제한합니다. 이 한계는 큰 값 리스트를 가진 매개변수화된 쿼리를 생성하는 Django 연산에 영향을 미칩니다:

Operation 한계에 도달하는 방법
filter(field__in=large_list) 각 리스트 항목은 매개변수가 됩니다. 백엔드는 2,048개 이상의 항목을 임시 테이블에 자동 최적화합니다.
prefetch_related() 각 부모 객체 ID는 관련 쿼리의 WHERE IN 절에서 매개변수가 됩니다. 2,048개 이상의 ID가 있을 때처럼 filter(field__in=...) 자동 최적화가 가능해요.
bulk_create() 각 객체의 각 필드는 매개변수가 됩니다. 10개의 필드와 250개의 객체를 가진 모델은 2,500개의 매개변수를 생성합니다.
bulk_update() 각 필드는 객체당 두 개의 매개변수(PK 매칭용, 값용)를 사용합니다.
Q() 여러 조건을 동반한다 체인된 Q 객체의 각 값은 매개변수가 됩니다.

대량 연산과 청크 큰 IN 쿼리로 설정 batch_size 하세요. 해결책은 성능 튜닝 을 참조하세요.

벌크 작전 한계

  • bulk_createreturn_rows_bulk_insert=False 카드는 ID를 반환하지 않습니다. 트리거가 있는 테이블에 필수입니다. mssql-django를 이용한 벌크 연산을 참고하세요.

테스트 프레임워크의 한계

--keepdb 관리 신원 인증(ActiveDirectoryMsi)을 사용할 때는 테스트 러너가 해당 인증 방법으로 데이터베이스를 생성하거나 파괴할 수 없기 때문에 필요합니다.

자세한 내용은 SQL Server로 Django 앱을 테스트하세요.

버전별 노트

MSSQL-Django 버전 Notes
1.7.3 이 모드 이외ActiveDirectoryMsi의 경우에는 Authentication= 고정됨.FA001 서브클래스 DatabaseWrapper 고정 KeyError (1.7.1에서 회귀).
1.7.2 datetimeoffset에 대한 고정 시간대 처리 및 Now() .USE_TZ=True Django 4.0 이후 버전 호환성 수정 .explain() .
1.7.1 Fabric 내 SQL 데이터베이스(EngineEdition 12) 수정. 하강 지각 AlterField 수정.
1.7 ODBC 드라이버 18이 기본값입니다. Django 6.0, Python 3.14, SQL Server 2025 지원이 추가되었습니다.
1.6 Django 5.1과 5.2 지원. 향상된 JSON 기능.
1.5 AutoField, 매개변수 서식, 스키마 쿼리에 대한 버그 수정.
1.4 Django 5.0 지원. db_comment 지원.
1.3 Django 4.2 지원.
1.2 Django 4.1 지원. 시간대 지원. return_rows_bulk_insert 선택지. SQL Server 2022 지원.
1.1 Django 3.2 및 4.0 지원.

Django 버전 전용 노트

장고 버전 Notes
5.1 inspectdb 복합 기본 키로 테이블을 검사할 수는 있지만, 완전한 모델 정의를 생성하지는 않습니다.
5.2 CompositePrimaryKey 지원은 부분적입니다. inspectdb 여전히 수동 수정이 필요하고, 서브쿼리와의 튜플 비교는 Django 5.2.4 이후 버전이 필요하며, 일부 마이그레이션과 JSONField bulk/CASE WHEN 업데이트 경로에는 테스트 제외가 여전히 포함되어 있습니다. 자세한 내용은 GitHub 저장소를 참조하세요.
6.0 Python 3.12 및 이후 버전이 필요합니다. 모든 5.2 제한이 적용됩니다. 백엔드는 6.0 API 변경 사항을 투명하게 처리합니다.

정규식(regex) 조회를 설정하세요

백엔드는 mssql-django Django와 __iregex 룩업을 __regex 지원하지만, 일회성 설정 단계가 필요합니다. 백엔드는 SQL Server에 기능을 제공하는 dbo.REGEXP_LIKE CLR 어셈블리(regex_clr.dll)를 제공합니다.

사전 요구 사항

  • CLR 통합을 지원하는 SQL Server 인스턴스입니다. 온프레미스 SQL Server와 Azure SQL Managed Instance가 CLR을 지원합니다. Azure SQL Database는 CLR 어셈블리를 지원하지 않아 __regex__iregex 서 Azure SQL Database에서는 조회를 사용할 수 없습니다.
  • 연결 사용자는 반드시 또는 ALTER SETTINGS 권한을 가져야 sysadmin 합니다. 관리 명령어는 CLR을 자동으로 활성화합니다.
  • mssql 앱은 반드INSTALLED_APPS시 .

CLR 어셈블리를 설치하세요

관리 명령을 실행하고 데이터베이스 이름을 전달하세요:

python manage.py install_regex_clr <your-database-name>

이 명령어는 다음과 같은 단계를 수행합니다:

  1. 서버에서 CLR을 활성화합니다(sp_configure 'clr enabled', 1).
  2. Sets clr strict security to 0 (SQL Server 2017+ 어셈블리에 SAFE 필요).
  3. 번들된 DLL에서 어셈블리를 regex_clr 생성합니다.
  4. 스칼라 함수를 dbo.REGEXP_LIKE 만듭니다.

Caution

0 설정하면 clr strict security 부호가 없는 CLR 어셈블리가 로드됩니다. 묶음에는 서명이 없기 때문에 regex_clr.dll 이 조치가 필요합니다. 이 변경에 대해 DBA와 상의한 후 프로덕션 서버에서 명령을 실행하세요. 이 설정은 데이터베이스별로 적용되는 것이 아니라 서버 전체에 적용됩니다.

정규 표현식 조회 사용법

어셈블리를 설치한 후, 쿼리 __iregex 셋 및 를 사용 __regex 하세요:

# Case-sensitive regex
products = Product.objects.filter(name__regex=r"^Widget \d+$")

# Case-insensitive regex
products = Product.objects.filter(name__iregex=r"^widget \d+$")

백엔드는 이러한 조회 dbo.REGEXP_LIKE(column, pattern, case_flag) = 1를 로 변환합니다.

Note

각 데이터베이스마다 명령어를 install_regex_clr 한 번씩 실행해야 합니다. 데이터베이스가 중단되었다가 다시 생성된다면(예: 테스트 중), 다시 명령을 실행하세요.