從 2.0 版開始,mssql-django可透過兩個 Python 資料庫驅動程式之一進行連線:
- pyodbc 搭配外部安裝的 Microsoft ODBC SQL Server 驅動程式。 這個驅動程式是預設的。
- mssql-python,Microsoft 的 Python 驅動程式,不需要另外安裝 ODBC 驅動程式。
你可以為每個資料庫別名選擇驅動程式。 其中一個別名可以使用 mssql-python ,而專案的其他部分則保留在 pyodbc。 在兩種情況下,ENGINE 的值都仍為 "mssql"。
選擇別名到 mssql-python
在該別名的python_driver字典中設定OPTIONS選項:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<database>",
"USER": "<user_id>",
"PASSWORD": "<password>",
"HOST": "<server>.database.windows.net",
"PORT": "1433",
"OPTIONS": {
"python_driver": "mssql_python",
"extra_params": "Encrypt=yes",
},
},
}
後端接受 "mssql_python"、"mssql-python" 和 "python",且比對時不區分大小寫。 省略 python_driver、留空,或設為 以 "pyodbc" 保留預設驅動程式。 因為設定是針對別名,你只能一次回滾一個資料庫,移除這個選項。
mssql-python 模組只有在別名選取它時才會被匯入。 如果安裝的版本早於 1.15.0,後端會引發 ImproperlyConfigured,並附上所需版本。
安裝需求
pip install mssql-django 安裝了兩個驅動程式。 路徑 mssql-python 沒有獨立安裝 ODBC 驅動程式。 安裝 --no-deps 或私有索引無法鏡像 mssql-python,會導致套件遺失,別名在匯入時失敗。
安裝 mssql-python 的平台前置條件,包括 macOS 上的 OpenSSL 以及 Linux 上的必要函式庫。
由於 mssql-python 是必要的相依性,mssql-django 2.0 只能安裝在具有相容 mssql-python 發行版本的平台上。 平台列表請參見 mssql-django 支援與生命週期。
行為差異
這兩個驅動程式建立不同的連接字串,並暴露不同的連接關鍵字。 在切換別名之前,請先閱讀本節。
連線設定
| Setting | pyodbc | MSSQL-Python |
|---|---|---|
HOST 與 PORT |
會根據驅動程式和 PORT,輸出為 SERVER、host_is_server,或 SERVER 加上 SERVERNAME。 |
一律輸出為 SERVER=<host>,<port>。 空白的 HOST 會變成 localhost。 |
driver |
選擇 ODBC 驅動程式。 預設為 Microsoft ODBC Driver 18 for SQL Server,並自動回退至 Driver 17。 | 已忽略。 沒有 Driver 17 的回退機制。 |
dsn |
支援。 | 已忽略。 |
host_is_server |
支援 FreeTDS。 | 已忽略。 |
unicode_results |
支援。 | 已忽略。 |
TOKEN |
支援。 | 支援。 提供PASSWORD,不含Authentication、TOKEN或USER關鍵字。 您的申請會取得並更新該代幣。 |
DATABASE_CONNECTION_POOLING |
適用。 | 適用。 |
逾時、重試、隔離等級、定序及 return_rows_bulk_insert 在兩種路徑中的行為都相同。
額外的連接參數
mssql-python 1.15 會根據允許清單驗證 extra_params,並拒絕清單之外的任何內容。 支援的關鍵字包括 Authentication、Encrypt、TrustServerCertificate、ServerCertificate、KeepAlive、KeepAliveInterval、IpAddressPreference、HostnameInCertificate、MultiSubnetFailover、PacketSize、ServerSPN、ApplicationIntent、ConnectRetryCount 以及 ConnectRetryInterval。
驅動程式會拒絕 DRIVER、DSN、MARS_Connection 和 SERVERNAME,以及 pyodbc 專用關鍵字,例如 APP、Description、Current Language、Network Library、ColumnEncryption、AnsiNPW、Connect Timeout、WSID、QuotedId、Regional、UseFMTONLY 和 LongAsMax。 在切換別名前先移除這些關鍵字,並用該 connection_timeout 選項取代 Connect Timeout。
當 extra_params 設定一個關鍵字,且後端同時產生時,顯式值會勝出。
多重作用中結果集
在 pyodbc 路徑中,當別名在 Windows 上使用 Microsoft ODBC 驅動程式時,後端會加入 MARS_Connection=yes。 系統會改為採用在 extra_params 中明確指定的 MARS_Connection 值,而且比對會忽略大小寫。
路徑 mssql-python 從未啟用 MARS,且會拒絕關鍵字 MARS_Connection ,因此你無法為該別名開啟 MARS。
沒有 MARS 的話,會在 QuerySet.iterator() 產生資料列前先讀完整結果到記憶體,讓巢狀查詢能重用該連線,且 chunk_size 不會改變這點。 將大型查詢集的記憶體用量納入考量。
對於拒絕 MARS 的端點,例如 Microsoft Fabric Warehouse,請參見「停用 MARS」。
編碼配置
兩個驅動程式都接受 setencoding 和 setdecoding,且每個項目會進入所選驅動程式的連接方式。 每個 setdecoding 條目都需要在兩個路徑上有 sqltype 鍵,而且同一個條目在任一驅動程式中都適用。 一個差別: mssql-python 接受 -99 , SQL_WMETADATA拒絕 pyodbc 。
選擇驅動程式
進行新的開發時,請使用 mssql-python。 它移除了容器映像與應用服務部署中 ODBC 驅動程式安裝步驟。
當您的部署仰賴具名 DSN、FreeTDS、透過 pyodbc 關鍵字使用 Always Encrypted、您自行管理的 ODBC 驅動程式版本或 MARS 時,請使用 ColumnEncryption。 關於 MARS 對每條路徑的要求,請參見 多重主動結果集。
現有專案可以繼續保留。pyodbc 它仍然是預設,並且完全支援。 當你真的要移轉時,一次只切換一個別名,並先對其執行測試套件,再移轉其餘別名。