mssql-django 的新功能

本文介紹 Django 資料庫後端各版本 mssql-django 的新功能、改進與變更。

版本 1.7.4

發行日期:2026年7月

1.7.4 版本是向後相容的修補版本,包含針對原始查詢處理和帶註解的 GROUP BY 查詢處理的兩項修正。

錯誤修正

  • IndexError 對於 GROUP BY 查詢中經跳脫的 %% 與實際參數:先前,任何帶有 GROUP BY 子句的查詢都會經過一個佔位符重寫步驟,其中會比對 %\w+,並將其替換為 {}。 該正則表達式也會比對到已逸出的 %% 字面值,因而插入虛假的預留位置符,並在查詢同時包含 %%-escape 與真正的 %s 參數時引發 IndexError: Replacement index N out of range。 縮小範圍後的正規表示式現在只會處理到 %%(原樣保留)和 %s(真正的佔位符),而這也是編譯器唯一會產生的模式。 相同的修正也能防止另一個無關的靜默錯誤:在不含參數的查詢中,像 `LIKE '%abc%'` 這種未逸出的模式會被改寫為 `LIKE '{}%'`,並回傳錯誤的資料列。
  • NotImplementedError對於IntegerChoices在原始GROUP BY查詢中:過去,將一個包含子IntegerChoices句的原始查詢傳遞GROUP BY值時,會引發 NotImplementedError: Not supported type <enum ...>。 參數型別輔助工具使用精確的型別檢查(typ == int),而 type(IntegerChoices_value) 是 enum class,不是 int,因此即使它是 int 的子類別,該值仍會落入 raise 分支。 現在 isinstance型別檢查使用 ,且 bool 分支在分支 int 之前被評估(因為 bool 本身就是一個 int 子類別)。 列舉選項現在會正確繫結,bool 仍會繫結至 BIT,而純文字 int 則維持不變。

版本 1.7.3

發行日期:2026年6月

1.7.3 版本是可回溯相容的修補程式版本,包含兩項連線與執行階段修正。

錯誤修正

  • 對於 FA001 中除 Authentication= 之外的 ActiveDirectoryMsi 模式:過去,後端僅針對 Trusted_Connection=yes 跳過 ActiveDirectoryMsi。 其他不提供USER值的 Entra 模式(例如 ActiveDirectoryIntegratedActiveDirectoryDefaultActiveDirectoryDeviceFlow) 仍會收到 Trusted_Connection=yes,ODBC 驅動以 (FA001) 拒絕。Cannot use Authentication option with Integrated Security option 此修正會以區分邊界且不區分大小寫的方式,比對任何明確指定的 Authentication= 值,並略過 Trusted_ConnectionIntegrated Security=SSPI。 密碼處理方式維持不變:SqlPasswordActiveDirectoryPasswordActiveDirectoryServicePrincipal 會繼續傳送 PWD,而 ActiveDirectoryInteractive 則會繼續省略 PWD
  • 對子類別化的KeyErrorDatabaseWrapper:快取的sql_server_versionto_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 的 explain 中繼資料的處理,使 .explain() 在 Django 4.0 及更新版本中不再因 AttributeError 而失敗。 後端現在會遵循符合版本的 explain 欄位,並在需要時正確引發 NotSupportedError
  • datetimeoffset 時區處理:固定 datetimeoffset 解析,使時區偏移被保留而非丟棄。 現在,傳回的日期時間會在預期情況下包含時區資訊。
  • Now()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):在 FabricEngineEdition=12 中認可的 SQL 資料庫()為 Azure 版本。 先前,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 驅動程式 18,若未安裝版本 18,則自動回退至 ODBC 驅動程式 17。

版本專屬註解

Django 版本 Notes
Django 5.1 inspectdb 可以檢查帶有複合主鍵的資料表,但無法產生完整的模型定義。
Django 5.2 CompositePrimaryKey 支援程度有限。 針對子查詢的元組比較需要 Django 5.2.4 或之後的版本,且某些遷移情況及 JSONField 邊緣案例仍然存在。
Django 6.0 需要 Python 3.12 或更新版本。 所有 5.2 的限制都適用。

版本 1.6

發行日期:2025年8月

  • 新增了 Django 5.1 和 5.2 支援。
  • 強化 JSON 功能與向下相容性。
  • 改善管線基礎設施。

1.5 版

發行日期:2024年4月

  • 新增supports_commentsdb_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 支援。
  • 新增時區支援(datetimeoffsetUSE_TZ=True)。
  • 新增了用於大量插入時擷取 ID 的 return_rows_bulk_insert 選項。
  • 新增了 SQL Server 2022 支援。
  • 新增JSONField對 Azure SQL 受控執行個體 的支援。

版本 1.1

發行日期:2022年7月

  • 支援 Django 3.2 和 4.0。
  • SQL Server 2016 及以後版本,以及 Azure SQL Database 支援。
  • pyodbc-式連線。