이 글에서는 SQL Server, Azure SQL Database, Azure SQL Managed Instance, Microsoft Fabric 내 SQL 데이터베이스와 함께 백엔드 mssql-django 를 사용할 때의 한계를 나열합니다.
Django 기능 제한
다음 Django 기능들은 백엔드에서 mssql-django 지원되지 않거나 제한적으로 지원됩니다:
| 특징 | 상태 | Details |
|---|---|---|
Avg와 DurationField |
지원되지 않음 | 집합은 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-djangoNvarchar(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_create이return_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>
이 명령어는 다음과 같은 단계를 수행합니다:
- 서버에서 CLR을 활성화합니다(
sp_configure 'clr enabled', 1). - Sets
clr strict securityto0(SQL Server 2017+ 어셈블리에SAFE필요). - 번들된 DLL에서 어셈블리를
regex_clr생성합니다. - 스칼라 함수를
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 한 번씩 실행해야 합니다. 데이터베이스가 중단되었다가 다시 생성된다면(예: 테스트 중), 다시 명령을 실행하세요.