mssql-django의 새로운 기능

이 문서에서는 Django 데이터베이스 백 엔드의 mssql-django 각 버전에서 새로운 기능, 개선 사항 및 변경 내용을 설명합니다.

버전 2.0

출시일: 2026년 9월

버전 2.0은 Microsoft의 mssql-python 드라이버를 pyodbc의 데이터베이스별 대안으로 추가하고, 지원되는 Python, Django 및 SQL Server 버전 조합을 상향 조정하며, 호환성 및 안정성 수정 사항을 포함합니다. pyodbc 기본 드라이버로 남아 있습니다.

하이라이트

  • mssql-python 드라이버 지원: 데이터베이스 별칭은 "python_driver": "mssql_python" 딕셔너리에서 OPTIONS로 옵트인합니다. 드라이버는 연결, 연결 풀링, 재시도, 트랜잭션 및 저장점, datetimeoffset 값, 인트로스펙션, Microsoft Entra 인증을 지원합니다. 해당 옵션을 지정하지 않은 별칭은 계속 pyodbc를 사용하므로, 옵트인하기 전까지는 아무것도 변경되지 않습니다. 자세한 내용은 mssql-django의 데이터베이스 드라이버 선택을 참조하세요.
  • mssql-python 경로에서는 별도의 ODBC 드라이버 설치가 필요 없음: mssql-python의 별칭에는 외부에 설치된 Microsoft SQL Server용 ODBC 드라이버가 필요하지 않습니다. pyodbc에 계속 남아 있는 별칭은 여전히 그대로 남아 있습니다.
  • 현대화된 지원 매트릭스: Python 3.10부터 3.14, Django 5.2부터 6.1, SQL Server 2017부터 2025까지. Django 6.0 및 그 이후 버전은 Python 3.12 이상이 필요합니다.

버그 수정

  • 명시적 MARS 설정은 적용됩니다: extra_params의 MARS_Connection 값이 명시적으로 지정된 경우 Windows 기본값으로 덮어쓰지 않고 그대로 유지되며, 일치 여부는 대소문자를 구분하지 않습니다. 설정 MARS_Connection=no이제 Microsoft Fabric Warehouse를 포함해 MARS를 허용하지 않는 엔드포인트에서도 작동합니다. MARS가 비활성화되면 ORM 반복은 결과를 가져오기 전에 버퍼링하여 중첩 쿼리가 연결을 재사용할 수 있게 하여, 대규모 쿼리셋에서는 더 많은 메모리를 소비합니다. 이 연결 수정은 마이그레이션이나 다른 SQL Server 기능에 대한 완전한 Warehouse 지원을 추가하지 않습니다.
  • 대괄호 와일드카드는 식 조회에서 이스케이프 처리됩니다: startswith 및 F()와 같이 contains 식으로 두 필드를 비교하는 패턴 조회는 SQL Server의 [ 와일드카드를 이스케이프 처리합니다. 괄호 문자는 와일드카드 문법이 아닌 데이터로 매칭됩니다.
  • 인용구는 inspectdb 스키마 이름에서 이스케이프됩니다: 값의 inspectdb --schema 단일 인용문은 메타데이터 쿼리에서 이스케이프되므로, 인용구가 포함된 스키마 이름은 더 이상 잘못된 형태의 Transact-SQL(T-SQL)를 생성하지 않습니다.
  • 비어 있는 HOST는 mssql-python 경로에서 localhost에 연결됩니다: Django가 빈 문자열로 채워 넣는 생략된 HOST는 빈 localhost 값으로 유효성 검사에 실패하는 대신 SERVER=로 확인됩니다. 이 동작은 로컬 인스턴스의 기본 동작과 일치 pyodbc 합니다.

Improvements

  • pytz를 zoneinfo 및 tzdata로 대체: 시간대 처리는 표준 라이브러리 zoneinfo 모듈을 사용하며, Windows 및 최소 컨테이너 이미지처럼 IANA 시간대 데이터베이스가 포함되지 않은 환경에서는 tzdata 패키지가 이를 제공합니다. 음의 일광절약 시간제 오프셋이 있는 구역의 경우 오프셋은 연중 정확히 유지됩니다. pytz 더 이상 의존성이 아닙니다.
  • 최신 SQL Server 버전도 허용됩니다: 백엔드가 인식하지 못하는 SQL Server 주요 버전은 버전 검증에 실패하지 않고 백엔드가 알고 있는 최신 기능 세트를 사용합니다. 해당 mssql-django 릴리스가 출시되기 전에도 새 SQL Server 릴리스에 연결할 수 있습니다. 연결을 수락한다고 해서 미검증 기능이 지원된다고 선언되는 것은 아닙니다.

파괴적 변경

  • Python 3.8과 3.9, 그리고 Django 3.2부터 5.1까지는 더 이상 지원되지 않습니다. 이전 버전의 호환성 코드는 그대로 유지되지만, 그 조합들은 테스트되거나 목록에 공개되지 않습니다.
  • mssql-python 1.15.0 이상은 별칭이 pyodbc를 사용하는 경우에도 필수 의존성입니다. 설치는 호환 mssql-python 가능한 배포판을 가진 플랫폼으로 제한되며, ARM64의 SUSE Linux는 제외됩니다. 다른 플랫폼의 프로젝트는 버전 1.8.0을 유지합니다.
  • 선언된 SQL Server 지원은 SQL Server 2017부터 시작되며, 선언된 네이티브 연결 지원은 Microsoft ODBC Driver 17과 Microsoft ODBC Driver 18로 제한됩니다.

버전 1.8.0

출시일: 2026년 8월

버전 1.8.0은 Django 6.1 지원을 추가하면서 Django 3.2부터 6.0까지는 계속 지원합니다. Django 6.0에서 6.1로 프로젝트를 옮기는 데는 이 섹션에서 설명한 두 가지 Django 6.1 기능 중 하나를 사용하지 않는 한 코드 변경이 필요하지 않습니다.

하이라이트

  • Django 6.1 지원: Django 3.2부터 6.0까지 계속 지원하면서 Django 6.1에 대해 검증됨. 의존성 제약은 django>=3.2,<6.1에서 django>=3.2,<6.2로 확대됩니다.
  • Django 6.1에서 사용하는 quote_name 쿼리 컴파일러: Django 6.1은 quote_name_unless_alias더 이상 지원되지 않습니다. 백엔드는 이제 Django 6.1 및 이후 버전을 호출 SQLCompiler.quote_name 하며, 버전별로 제한되어 이전 Django 버전은 변경되지 않습니다. 슬라이스 및 오프셋 쿼리(예: qs[a:b] 및 OFFSET ... FETCH)는 지원 중단 경고 없이 컴파일됩니다.
  • 외래 키 정보 조회는 ON DELETE 규칙까지 반환합니다: Django 6.1에서는 DELETE가 데이터베이스 수준의 ON get_relations() 규칙을 포함하도록 확장되었습니다. 백엔드는 예상한 세 부분 구조를 반환하고 SQL Server NO ACTION 외래 키를 그에 따라 매핑하므로, inspectdb와 외래 키 인트로스펙션이 정확한 모델을 생성합니다.

지원되지 않는 Django 6.1 기능

이 백엔드에는 두 가지 Django 6.1 추가 기능이 서로 다른 이유로 제공되지 않습니다:

  • 데이터베이스 수준의 참조 동작 (DB_CASCADE, DB_SET_NULL, DB_SET_DEFAULT): SQL Server는 동일한 테이블에 여러 개의 캐스케이드 경로를 가진 외래키 그래프를 거부하므로(오류 1785), 따라서 SQL Server 버전에서는 이 기능에 대한 네이티브 경로가 없습니다. 이 값들 중 하나를 사용하면 Django 시스템 검사 fields.E324가 올라가며, 표준 Django 수준 on_delete으로 가리키게 됩니다.
  • 비트 단위 집계 함수 (BitAnd, BitOr, BitXor): SQL Server에는 기본 제공 비트 단위 집계 함수가 없고 백엔드에서도 이를 에뮬레이션하지 않으므로, 이러한 집계 함수는 NotSupportedError를 발생시킵니다.

자세한 내용은 mssql-django의 제한 사항 및 지원되지 않는 기능을 참조하세요.

버전 1.7.4

출시일: 2026년 7월

버전 1.7.4는 원시 쿼리 처리와 주석이 달린 GROUP BY 쿼리 처리에 대한 두 가지 수정이 포함된 하위 호환 패치 릴리스입니다.

버그 수정

  • IndexError 이스케이프된 GROUP BY 및 실제 매개변수가 있는 %% 쿼리에서: 이전에는 GROUP BY 절이 있는 모든 쿼리가 %\w+와 일치하는 플레이스홀더 재작성 단계를 거쳐 이를 {}로 대체했습니다. 이 정규식은 이스케이프된 %% 리터럴과도 일치했는데, 이로 인해 유령 자리 표시자가 삽입되었고 쿼리가 IndexError: Replacement index N out of range-이스케이프와 실제 %% 매개변수를 함께 사용하면 언제나 %s를 발생시켰습니다. 이제 더 좁혀진 정규식은 %%(그대로 보존됨)과 %s(실제 자리 표시자)에만 영향을 미치며, 이것이 컴파일러가 항상 생성하는 유일한 패턴입니다. 같은 수정은 또한 매개변수가 없는 쿼리에서 LIKE '%abc%'와 같은 이스케이프되지 않은 패턴이 LIKE '{}%'로 재작성되어 잘못된 행이 반환되던 별개의 무증상 버그도 방지합니다.
  • raw NotImplementedError 쿼리에서 IntegerChoices에 대한 GROUP BY: 이전에는 IntegerChoices 절이 포함된 raw NotImplementedError 쿼리에 NotImplementedError: Not supported type <enum ...> 값을 전달하면 가 발생했습니다. 매개변수 타입 도우미는 정확한 타입 검사(typ == int)를 사용했으며, type(IntegerChoices_value)는 int가 아니라 enum 클래스였기 때문에 int의 서브클래스인데도 그 값은 예외 발생 처리로 넘어갔습니다. 이제 타입 검사에 isinstance를 사용하며, bool 분기보다 int 분기가 먼저 평가됩니다(bool 자체가 int의 하위 클래스이기 때문입니다). Enum 선택 항목은 이제 올바르게 바인딩되고, bool는 여전히 BIT에 바인딩되며, 일반 int는 변경되지 않습니다.

버전 1.7.3

릴리스 날짜: 2026년 6월

버전 1.7.3은 두 개의 연결 및 런타임 수정이 포함된 이전 버전과 호환되는 패치 릴리스입니다.

버그 수정

  • FA001 이외의 Authentication= 모드에 대한 ActiveDirectoryMsi: 이전에는 백엔드가 Trusted_Connection=yes에 대해서만 ActiveDirectoryMsi를 건너뛰었습니다. USER 값을 제공하지 않는 다른 Entra 모드(예: ActiveDirectoryIntegrated, ActiveDirectoryDefault, ActiveDirectoryDeviceFlow)도 여전히 Trusted_Connection=yes를 받았으며, ODBC 드라이버는 이를 FA001(Cannot use Authentication option with Integrated Security option)와 함께 거부했습니다. 이 수정은 경계를 인식하고 대/소문자를 구분하지 않는 방식으로 명시적 Authentication= 값을 감지하며, Trusted_Connection와 Integrated Security=SSPI는 모두 건너뜁니다. 비밀번호 처리는 변경되지 않았습니다: SqlPassword, ActiveDirectoryPassword, 및 ActiveDirectoryServicePrincipal는 계속 PWD를 전송하는 반면, ActiveDirectoryInteractive는 계속 이를 제외합니다.
  • KeyError 하위 클래스로 만든 DatabaseWrapper에서: 캐시된 sql_server_version 및 to_azure_sql_db 속성은 type(self).__dict__에 대한 cached_property 인트로스펙션에 의존했으며, 이로 인해 KeyError의 서브클래스가 해당 속성들에 처음 접근할 때 DatabaseWrapper가 발생했습니다(1.7.1에서 도입된 회귀). 이 수정에서는 _known_versions를 통해 액세스되는 명시적인 클래스 수준 딕셔너리(_known_azures, self.)를 사용하므로, 조회가 MRO를 통해 해결되고 서브클래싱된 래퍼가 올바르게 동작합니다.

버전 1.7.2

릴리스 날짜: 2026년 5월

버전 1.7.2는 표준 시간대 및 호환성 수정이 포함된 이전 버전과 호환되는 패치 릴리스입니다.

버그 수정

  • .explain() Django 4.0 이상에 대한 호환성: Django 4.0 이상에서 더 이상 실패 .explain() 하지 않도록 AttributeError Django 설명 메타데이터의 컴파일러 처리를 수정했습니다. 이제 백엔드는 버전에 맞는 explain 필드를 따르며, 필요할 때는 NotSupportedError를 올바르게 발생시킵니다.
  • datetimeoffset 표준 시간대 처리: 표준 시간대 오프셋이 삭제되지 않고 유지되도록 datetimeoffset 구문 분석이 수정되었습니다. 이제 반환되는 날짜/시간 값은 필요한 경우 시간대 정보가 포함된 상태로 제공됩니다.
  • Now() with USE_TZ=True: 시간대 지원이 활성화된 경우 시간대 인식 동작을 사용하도록 Now()에 대한 SQL 생성을 업데이트하여 UTC가 아닌 SQL Server 호스트에서 타임스탬프 드리프트를 방지합니다.

버전 1.7.1

릴리스 날짜: 2026년 4월

버전 1.7.1은 버그 수정이 포함된 이전 버전과 호환되는 패치 릴리스입니다.

버그 수정

  • FieldDoesNotExist 인덱스 순서가 내림차순일 때 필드를 변경하는 경우: 인덱스 필드 이름을 해결할 때 _alter_field() 대신 schema.py를 사용하도록 index.fields_orders의 index.fields를 수정했습니다. 이전 코드는 정렬 정보가 포함된 원시 필드 문자열(예: "-pub_date")을 model._meta.get_field()에 전달했으며, 이로 인해 FieldDoesNotExist가 발생했습니다. 이제 필드 이름만 추출되고 순서 지정 접미사가 제대로 삭제됩니다.
  • Microsoft Fabric 지원의 SQL 데이터베이스(EngineEdition 12): Fabric(EngineEdition=12)에서 Azure 버전으로 인식된 SQL 데이터베이스입니다. 이전에는 Fabric의 엔진 에디션을 인식하지 못해 to_azure_sql_db가 False을 반환하고 기능 게이트 확인이 실패했습니다. 수정 사항은 EDITION_AZURE_SQL_FABRIC=12에 _AZURE_EDITIONS를 추가하고 Fabric을 최신 지원 SQL Server 버전에 매핑합니다. JSONField, 해시 함수, 데이터 정렬 정보 조회 및 테스트 데이터베이스 정리는 이제 Fabric에서 올바르게 작동합니다.

버전 1.7

릴리스 날짜: 2026년 3월

하이라이트

  • Django 6.0 지원: Django 6.0과의 완전한 호환성( Python 3.12 이상이 필요합니다. 모든 6.0 API 변경 내용은 백 엔드에서 투명하게 처리됩니다.
  • 부분 CompositePrimaryKey 지원: 백 엔드는 Django 5.2 CompositePrimaryKey에 대한 부분 지원을 추가합니다. 하위 쿼리에 대한 튜플 비교에는 Django 5.2.4 이상이 필요하며 일부 복합 키 및 JSONField 에지 사례는 남아 있습니다. Django 5.2 자체는 mssql-django 1.6에서 처음 지원되었습니다.
  • SQL Server 2025 지원: SQL Server 2025에 대해 유효성이 검사되었습니다.
  • ODBC 드라이버 18 기본값: 이제 백 엔드는 SQL Server ODBC Driver 18로 기본 설정되며 버전 18이 설치되지 않은 경우 ODBC Driver 17로 자동 대체됩니다.

버전별 참고 사항

Django 버전 Notes
장고 5.1 inspectdb 는 복합 기본 키가 있는 테이블을 검사할 수 있지만 전체 모델 정의를 생성하지는 않습니다.
Django 5.2 CompositePrimaryKey 지원은 부분적입니다. 하위 쿼리에 대한 튜플 비교에는 Django 5.2.4 이상이 필요하며 일부 마이그레이션과 JSONField 에지 케이스는 남아 있습니다.
장고 6.0 Python 3.12 이상이 필요합니다. 모든 5.2 제한 사항이 적용됩니다.

버전 1.6

릴리스 날짜: 2025년 8월

  • Django 5.1 및 5.2 지원이 추가되었습니다.
  • 향상된 JSON 기능 및 이전 버전과의 호환성
  • 파이프라인 인프라가 개선되었습니다.

버전 1.5

릴리스 날짜: 2024년 4월

  • supports_comments용 db_comments기능 플래그가 추가되었습니다.
  • 매개 변수 형식 지정 및 스키마 쿼리에 대한 AutoField버그 수정

버전 1.4

릴리스 날짜: 2024년 1월

  • Django 5.0 지원이 추가되었습니다.
  • db_comment 지원이 추가되었습니다.
  • 날짜/시간 변환 및 빈 집계에 대한 버그 수정

버전 1.3

릴리스 날짜: 2023년 5월

  • Django 4.2 지원이 추가되었습니다.
  • 대/소문자를 구분 Replace 하는 함수 지원이 추가되었습니다.
  • OFFSET 처리 및 왼쪽 패딩 관련 버그 수정

버전 1.2

릴리스 날짜: 2022년 12월

  • Django 4.1 지원이 추가되었습니다.
  • 표준 시간대 지원(datetimeoffset 포함 USE_TZ=True)이 추가되었습니다.
  • 대량 삽입 ID 검색에 대한 옵션이 추가 return_rows_bulk_insert 되었습니다.
  • SQL Server 2022 지원이 추가되었습니다.
  • Azure SQL Managed Instance 대한 지원이 추가되었습니다JSONField.

버전 1.1

릴리스 날짜: 2022년 7월

  • Django 3.2 및 4.0 지원.
  • SQL Server 2016 이상 및 Azure SQL Database 지원.
  • pyodbc 기반 연결.