Možnosti připojení pro mssql-django

Tento článek vysvětluje nastavení slovníku OPTIONS v konfiguraci Django DATABASES . Tato nastavení řídí, jak mssql-django se připojuje k SQL Server prostřednictvím ovladače ODBC.

Výběr ovladače ODBC

Od verze mssql-django 1.7 je backend ve výchozím nastavení nastaven na ODBC Driver 18 for SQL Server. Pokud není nainstalovaný ovladač ODBC 18, back-end se automaticky vrátí do ovladače ODBC 17.

Note

Ovladač ODBC 18 ve výchozím nastavení povolí Encrypt=yes a ověří certifikát serveru. Připojení, která fungovala s Driver 17, mohou selhat kvůli chybě důvěryhodnosti SSL/TLS. Řešení chyby:

  • Pro místní SQL Server nainstalujte certifikát serveru z certifikační autority, které už klienti důvěřují, nebo stávající certifikát serveru naimportujte do každého úložiště důvěryhodnosti klienta. Pokyny najdete v tématu Konfigurace Databázový stroj systému SQL Server pro šifrování připojení.
  • Pokud se připojíte podle IP adresy nebo aliasu, který neodpovídá předmětu certifikátu nebo alternativnímu názvu subjektu (SAN), přidejte HostNameInCertificate=<name-from-certificate> do extra_paramssouboru .

Informace o místním vývoji proti certifikátu s vlastním podpisem najdete TrustServerCertificate v části Další parametry ODBC.

Ovladač můžete explicitně zadat:

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",
        },
    },
}

V Linuxu můžete také zadat úplnou cestu ke knihovně ovladačů:

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 vs HOST

Můžete se připojit pomocí HOST názvu nebo názvu DSN (Název zdroje dat).

Připojit se k HOST

Většina konfigurací používá HOST nastavení přímo:

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",
        },
    },
}

Připojení pomocí DSN

Použijte pojmenované DSN nakonfigurované ve zdrojích dat ODBC:

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

Podpora FreeTDS

Chcete-li jako ovladač ODBC použít FreeTDS, nastavte host_is_server na Truehodnotu . To říká back-endu, aby místo vyhledávání názvu datového serveru používal HOST a PORT přímo v 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,
        },
    },
}

Další informace o připojeních bez DSN pomocí FreeTDS najdete v uživatelské příručce FreeTDS.

Další parametry ODBC

Pomocí extra_params předejte další parametry připojovacího řetězce ODBC. Hodnota je řetězec oddělený středníkem připojený k připojovací řetězec:

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",
        },
    },
}

Toto nastavení se používá také pro Microsoft Entra ověřovací klíčová slova.

Caution

Používejte TrustServerCertificate=yes pouze pro místní vývoj s certifikáty podepsanými svým držitelem. Nepoužívejte ho v produkčním prostředí. Zakáže ověřování řetězce certifikátů a zvyšuje riziko útoku typu man-in-the-middle. Nainstalujte na server důvěryhodný certifikát a připojte se pomocí TrustServerCertificate=no.

Časové limity připojení a opakované pokusy

Konfigurace odolnosti připojení pomocí časového limitu a nastavení opakování:

Option Default Description
connection_timeout 0 (zakázáno) Maximální počet sekund čekání na připojení
connection_retries 5 Počet opakovaných pokusů o selhání připojení
connection_retry_backoff_time 5 Sekundy čekání mezi opakovanými pokusy.
query_timeout 0 (zakázáno) Maximální počet sekund čekání na dokončení dotazu

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

Nastavte vlastní kolaci pro vyhledávání v textových polích:

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",
        },
    },
}

Více databázových připojení

Django podporuje připojení k více databázím současně. To je užitečné například pro repliky určené ke čtení, dotazy mezi databázemi nebo oddělení pracovních zátěží podle úrovně izolace.

Konfigurace více databází

Definujte každé připojení v DATABASES nastavení:

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",
        },
    },
}

Caution

READ UNCOMMITTED umožňuje špinavé čtení. Tuto úroveň izolace použijte pouze pro dotazy pro účely sestav nebo analýz, u nichž není vyžadována absolutní přesnost. Další informace naleznete v tématu Správa transakcí.

Směrování dotazů pomocí směrovače databáze

Vytvořte směrovač databáze pro přímé operace čtení a zápisu do příslušného připojení:

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"

Zaregistrujte směrovač v settings.py:

DATABASE_ROUTERS = ["myproject.routers.ReadReplicaRouter"]

Uložte třídu směrovače do souboru, například myproject/routers.py.

Dotazování konkrétní databáze přímo

Použijte metodu using() k dotazování konkrétního aliasu databáze:

# 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)

Další informace o úrovních izolace v databázích pro jednotlivá připojení viz Čtení dat bez blokování.