mssql-django 的連線選項

本文說明你的 Django DATABASES 設定中的 OPTIONS 字典設定。 這些設定控制如何mssql-django透過 ODBC 驅動程式連接 SQL Server。

ODBC 驅動程式選擇

從 1.7 版本起mssql-django,後端預設為 SQL Server 的 ODBC 驅動程式 18。 如果沒有安裝 ODBC 驅動程式 18,後端會自動回退到 ODBC 驅動程式 17。

Note

ODBC Driver 18 Encrypt=yes 預設啟用並驗證伺服器憑證。 使用 Driver 17 的連線可能會因 SSL/TLS 信任錯誤而失敗。 解決失敗問題的方法:

  • 對於本地 SQL Server,請從客戶端已信任的憑證授權中心安裝伺服器憑證,或將現有的伺服器憑證匯入每個用戶端信任儲存庫。 有關相關說明,請參閱「配置 SQL Server Database Engine」以加密連線
  • 如果你用 IP 位址或與憑證主體或主體替代名稱(SAN)不符的別名連線,請加上 HostNameInCertificate=<name-from-certificate>extra_params

關於針對自簽憑證的本地開發,請參見 TrustServerCertificateExtra ODBC 參數

你可以明確指定驅動程式:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 17 for SQL Server",
        },
    },
}

在 Linux 上,你也可以指定驅動程式庫的完整路徑:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.0.so.1.1",
        },
    },
}

DSN 與 HOST 的比較

你可以用 HOST 名稱或命名的 DSN(資料來源名稱)來連接。

與 HOST 連結

大多數配置直接使用以下 HOST 設定:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

與DSN連結

請在你的 ODBC 資料來源中使用指定的 DSN:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "OPTIONS": {
            "dsn": "MyDataSourceName",
        },
    },
}

FreeTDS 支援

若要使用 FreeTDS 作為 ODBC 驅動程式,請設定 host_is_serverTrue。 這會告訴後端直接使用 HOSTPORT ,而不是在 : 中查找資料伺服器名稱 freetds.conf

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "FreeTDS",
            "host_is_server": True,
        },
    },
}

欲了解更多關於FreeTDS無DSN連線的資訊,請參閱 FreeTDS使用者指南

額外的 ODBC 參數

使用 extra_params 傳遞額外的 ODBC 連線字串參數。 該值是一個以分號分隔的字串,附加在 連接字串 上:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>.database.windows.net",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": "TrustServerCertificate=yes;ApplicationIntent=ReadOnly",
        },
    },
}

此設定也用於 Microsoft Entra 認證關鍵字。

謹慎

僅用於 TrustServerCertificate=yes 本地開發,並使用自簽憑證。 不要在生產環境中使用它。 它會禁用憑證鏈驗證,並增加中間攻擊者的風險。 在伺服器上安裝受信任憑證並連接到 TrustServerCertificate=no

連線逾時與重試

使用逾時與重試設定來提高連線韌性:

Option 預設 Description
connection_timeout 0 (禁用) 等待連線的最大秒數。
connection_retries 5 連線失敗時的重試次數。
connection_retry_backoff_time 5 每次重試之間的等待秒數。
query_timeout 0 (禁用) 等待查詢完成的最長秒數。

Example:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "connection_timeout": 30,
            "connection_retries": 3,
            "connection_retry_backoff_time": 10,
            "query_timeout": 120,
        },
    },
}

Collation

為文字欄位查詢設定自訂定序:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "collation": "Chinese_PRC_CI_AS",
        },
    },
}

多重資料庫連接

Django 支援同時連接多個資料庫。 這對於讀取副本、跨資料庫查詢或依隔離層級分離工作負載非常有用。

配置多個資料庫

DATABASES 設定中定義每個連線:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "app_db",
        "HOST": "<your-primary-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
    "readonly": {
        "ENGINE": "mssql",
        "NAME": "app_db",
        "HOST": "<your-readonly-replica>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": "Encrypt=yes;ApplicationIntent=ReadOnly",
        },
    },
    "analytics": {
        "ENGINE": "mssql",
        "NAME": "analytics_db",
        "HOST": "<your-analytics-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "isolation_level": "READ UNCOMMITTED",
        },
    },
}

謹慎

READ UNCOMMITTED 允許髒讀。 此隔離層僅用於報告或分析查詢,且不需要絕對精確度。 欲了解更多資訊,請參閱 交易管理

使用資料庫路由器進行路由查詢

建立資料庫路由器,將讀寫操作導向適當的連線:

class ReadReplicaRouter:
    """Route read queries to the readonly replica, writes to the primary."""

    def db_for_read(self, model, **hints):
        return "readonly"

    def db_for_write(self, model, **hints):
        return "default"

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return db == "default"

settings.py 中註冊路由器:

DATABASE_ROUTERS = ["myproject.routers.ReadReplicaRouter"]

將路由器類別儲存在像 myproject/routers.py. 這樣的檔案中。

直接查詢特定資料庫

使用 using() 該方法查詢特定的資料庫別名:

# Explicit read from analytics database
reports = AnalyticsReport.objects.using("analytics").filter(date__gte="2025-01-01")

# Write to default
Product.objects.create(name="Widget", price=9.99)

欲了解更多關於每個連線資料庫隔離等級的資訊,請參閱 「無阻塞讀取資料」。