Az mssql-django kapcsolati beállításai

Ez a cikk a OPTIONS Django-konfiguráció DATABASES szótárbeállításait ismerteti. Ezek a beállítások szabályozzák, hogyan mssql-django csatlakozik az SQL Server-hez.

Python adatbázis illezőprogram-választás

mssql-djangoA 2.0-s és újabb verziók vagy a(z) alapértelmezett pyodbc használatával, vagy a Microsoft mssql-python illesztőprogramján keresztül csatlakoznak. Válassz mssql-python adatbázis aliast a következő python_driver opcióval:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<database>",
        "USER": "<user_id>",
        "PASSWORD": "<password>",
        "HOST": "<server>",
        "PORT": "1433",
        "OPTIONS": {
            "python_driver": "mssql_python",
        },
    },
}

Ne állítsd be a(z) driver elemet ezen az elérési úton. A mssql-python elérési út figyelmen kívül hagyja a driver, dsn, host_is_server és unicode_results beállításokat, ellenőrzi, hogy a(z) extra_params szerepel-e az engedélyezési listán, és nem engedélyezi a MARS használatát. A viselkedésbeli különbségek teljes listájáért lásd: Válassza ki az mssql-django adatbázis-meghajtóját. A cikk további része az alapértelmezett pyodbc útvonalat írja le, hacsak nem van megjelölve.

ODBC-illesztő kiválasztása

A pyodbc útvonalon a háttérrendszer alapértelmezetten az ODBC Driver 18 for SQL Server illesztőprogramot használja. Ha az ODBC Driver 18 nincs telepítve, a háttérrendszer automatikusan visszakerül az ODBC-illesztőprogram 17-esére. Egy kifejezetten konfigurált illesztőprogram nem tér vissza.

Note

Az ODBC Driver 18 alapértelmezés szerint engedélyezi Encrypt=yes és ellenőrzi a kiszolgálótanúsítványt. A 17-es illesztőprogrammal korábban működő kapcsolatok SSL/TLS-megbízhatósági hiba miatt meghiúsulhatnak. A hiba megoldása:

  • Helyszíni SQL Server esetén telepítsen egy kiszolgálótanúsítványt egy olyan hitelesítésszolgáltatótól, amelybe az ügyfelek már megbíznak, vagy importálja a meglévő kiszolgálótanúsítványt minden ügyfélmegbízhatósági tárolóba. Útmutatásért lásd: SQL Server adatbázismotor konfigurálása a kapcsolatok titkosításához.
  • Ha olyan IP-címmel vagy álnévvel csatlakozik, amely nem egyezik a tanúsítvány tulajdonosnevével vagy alternatív tulajdonosnevével (SAN), adja hozzá a(z) HostNameInCertificate=<name-from-certificate> elemet a következőhöz: extra_params.

Ha önaláírt tanúsítvánnyal végez helyi fejlesztést, lásd a(z) TrustServerCertificate című rész elemét.

Az illesztőprogramot explicit módon is megadhatja:

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

Linuxon megadhatja az illesztőprogram-kódtár teljes elérési útját is:

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 és HOST

A csatlakozáshoz használhat egy HOST nevet vagy egy nevesített DSN-t (adatforrás neve).

Kapcsolódás a HOST-hoz

A legtöbb konfiguráció közvetlenül használja a HOST beállítást:

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

Csatlakozás a DSN-hez

Használja az ODBC-adatforrásokban konfigurált nevesített DSN-t:

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

FreeTDS-támogatás

A FreeTDS ODBC-illesztőprogramként való használatához állítsa a(z) host_is_server értékét True értékre. Ez arra utasítja a háttérrendszert, hogy közvetlenül a(z) HOST és PORT elemeket használja ahelyett, hogy a(z) freetds.conf elemben keresné ki az adatkiszolgáló nevét:

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

A FreeTDS-sel létesített DSN-nélküli kapcsolatokról további információt a FreeTDS felhasználói útmutatójában talál.

További ODBC-paraméterek

További ODBC-kapcsolati karakterlánc paraméterek átadására használhatóextra_params. Az érték egy pontosvesszővel tagolt karakterlánc, amely a kapcsolati karakterlánchoz van hozzáfűzve:

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

Ez a beállítás Microsoft Entra hitelesítési kulcsszavakhoz is használható.

Amikor Azure SQL Database-hez, Azure SQL Managed Instance-hez, a Microsoft Fabricben lévő SQL-adatbázishoz, egy rendelkezésre állási csoport figyelőjéhez vagy egy feladatátvevő fürtpéldányhoz csatlakozik, adja hozzá a(z) MultiSubnetFailover=Yes elemet a(z) extra_params elemhez. Ha a kiszolgáló neve egynél több IP-címre oldódik fel, az illesztőprogram egyszerre csatlakozik az összes ilyen címhez, és azt használja, amelyik elsőként válaszol. Enélkül a meghajtó egyenként próbálja meg a címeket, és egy nem válaszoló cím elhasználja a fennmaradó hitelesítési időkorlátot, mielőtt a vezető továbblép a következőre. Amikor a DNS egyetlen címre oldódik, az illesztőprogram egyetlen kapcsolati kísérletet indít, így a beállítás biztonságosan bekapcsolva maradhat.

MultiSubnetFailover=Yes a következő korlátokkal rendelkezik:

  • Nem használhatod más protokollon, mint TCP-n.

  • Egy több mint 64 IP-címmel konfigurált SQL Server példányhoz való csatlakozás meghiúsult.

  • Adatbázis tükrözéssel nem lehet használni. Az illesztőprogram hibát ad vissza, ha a kapcsolati karakterlánc megadja a(z) Failover_Partner elemet, valamint akkor is, ha a kiszolgáló azt jelzi, hogy az adatbázis tükrözve van. Az adatbázis tükrözése minden támogatott SQL Server verzióban elavult. Használja inkább az Always On rendelkezésre állási csoportokat.

Caution

Csak helyi fejlesztéshez használható TrustServerCertificate=yes önaláírt tanúsítványokkal. Ne használja éles környezetben. Letiltja a tanúsítványlánc érvényesítését, és növeli a középen belüli támadói kockázatot. Telepítsen egy megbízható tanúsítványt a kiszolgálón, és csatlakozzon a kiszolgálóhoz TrustServerCertificate=no.

Kapcsold ki a MARS-t

pyodbc Az útvonalon a háttérrendszer alapértelmezetten engedélyezi a Multiple Active Outcome Set (MARS) funkciót, ha Microsoft ODBC illesztőprogramot használ Windows-on. Néhány végállomás elutasítja a MARS_Connection kulcsszót, például a Microsoft Fabric Warehouse. Az egyik végponthoz való csatlakozáshoz állítsd be a MARS_Connection=no értéket az adott alias extra_params mezőjében:

DATABASES = {
    "warehouse": {
        "ENGINE": "mssql",
        "NAME": "<database>",
        "USER": "<user_id>",
        "PASSWORD": "<password>",
        "HOST": "<server>.datawarehouse.fabric.microsoft.com",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": "Authentication=ActiveDirectoryServicePrincipal;MARS_Connection=no",
        },
    },
}

A mssql-django 2.0-tól kezdve egy explicit MARS_Connection értéket tisztelnek, és a match figyelmen kívül hagyja a case esetet, így a háttérrendszer nem csatol ellentmondó alapértelmezet. Az 1.8.0 és korábbi verziókban a Windows alapértelmezett módon felülírta az explicit értéket, és a kapcsolat meghibásodott.

A MARS letiltásakor a(z) QuerySet.iterator() a teljes eredményt beolvassa a memóriába, mielőtt sorokat adna vissza, így egy beágyazott lekérdezés ismét használhassa a kapcsolatot. Vegyük figyelembe a memóriaigényt nagy lekérdezéshalmazok esetén.

Más hitelesítési módszerekhez tartsd meg a megfelelő hitelesítési beállításokat, és add hozzá MARS_Connection=no .extra_params Ez a kapcsolatbeállítás nem jelenti azt, hogy teljes Microsoft Fabric Warehouse támogatást nyújtana a Django migrációkhoz vagy más SQL Server funkciókhoz.

Az mssql-python út nem engedélyezi a MARS-t, és elutasítja a MARS_Connection kulcsszót, így ez a beállítás csak a pyodbc-re vonatkozik.

Kapcsolati időtúllépések és újrapróbálkozások

Konfigurálja a kapcsolat rugalmasságát időtúllépési és újrapróbálkozási beállításokkal:

Option Alapértelmezett Leírás
connection_timeout 0 (letiltva) A kapcsolatra való várakozás maximális másodperce.
connection_retries 5 A csatlakozási hiba újrapróbálkozási kísérleteinek száma.
connection_retry_backoff_time 5 Várakozási idő az újrapróbálkozási kísérletek között.
query_timeout 0 (letiltva) A lekérdezés befejezésére váró maximális másodperc.

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

connection_timeout=0 a mssql-django alapértelmezett beállítása. Mivel a pyodbc csak akkor hívja meg a SQLSetConnectAttr(SQL_ATTR_LOGIN_TIMEOUT, ...) elemet, ha pozitív értéket adsz meg, az illesztőprogramtól függő alapértelmezés érvényes (a Microsoft ODBC Driver for SQL Server esetében 15 másodperc). Állíts be egy explicit értéket, hogy a nem reagáló csatlakozási kísérletek kiszámíthatóan kudarcot valljanak.

Ha a cél Azure SQL Database kiszolgáló nélküli, és az automatikus szüneteltetés engedélyezve van, használj legalább 60. Az automatikusan szüneteltetett adatbázis az első csatlakozási kísérletkor újraindul, és ez a kísérlet 40613-as hibával sikertelen lehet, miközben az adatbázis újraindul. Rövidebb időkéréssel az első csatlakozási próbálkozás időlejár, mielőtt az önéletrajz befejeződik. connection_retries végül sikerül, de az első kérésnek több időtúllépést kell kivárnia, mielőtt létrejön a kapcsolat. További információkért lásd: Automatikus szüneteltetés és automatikus folytatás.

Collation

Egyéni rendezés beállítása szövegmező-keresésekhez:

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

Több adatbázis-kapcsolat

A Django támogatja a több adatbázishoz való egyidejű csatlakozást. Ez hasznos olvasási replikákhoz, adatbázisközi lekérdezésekhez vagy a számítási feladatok elkülönítési szint szerinti elválasztásához.

Több adatbázis konfigurálása

Adja meg az egyes kapcsolatokat a DATABASES beállításban:

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 lehetővé teszi a piszkos olvasást. Ezt az elkülönítési szintet csak olyan jelentéskészítési vagy elemzési lekérdezésekhez használja, ahol nincs szükség abszolút pontosságra. További információ: Tranzakciókezelés.

Lekérdezések átirányítása adatbázis-útválasztóval

Hozzon létre egy adatbázis-útválasztót az olvasási és írási műveletek megfelelő kapcsolathoz való irányításához:

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"

Regisztrálja az útválasztót a következő helyen settings.py:

DATABASE_ROUTERS = ["myproject.routers.ReadReplicaRouter"]

Mentse az útválasztó osztályt egy fájlba, például myproject/routers.py.

Adott adatbázis közvetlen lekérdezése

using() A metódussal lekérdezhet egy adott adatbázis-aliast:

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

A kapcsolatonkénti adatbázisok elkülönítési szintjeiről további információt az Adatok blokkolás nélküli olvasása című témakörben talál.