Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden die OPTIONS Wörterbucheinstellungen in Ihrer Django-Konfiguration DATABASES erläutert. Diese Einstellungen steuern, wie mssql-django eine Verbindung mit SQL Server über den ODBC-Treiber hergestellt wird.
ODBC-Treiberauswahl
mssql-django Ab 1.7 wird das Back-End standardmäßig auf ODBC-Treiber 18 für SQL Server festgelegt. Wenn ODBC-Treiber 18 nicht installiert ist, greift das Back-End automatisch auf ODBC-Treiber 17 zurück.
Note
ODBC-Treiber 18 aktiviert Encrypt=yes standardmäßig und überprüft das Serverzertifikat. Verbindungen, die mit Treiber 17 gearbeitet haben, können mit einem SSL/TLS-Vertrauensfehler fehlschlagen. So beheben Sie den Fehler:
- Installieren Sie für lokale SQL Server ein Serverzertifikat von einer Zertifizierungsstelle, der Ihre Clients bereits vertrauen, oder importieren Sie das vorhandene Serverzertifikat in jeden Clientvertrauensspeicher. Anweisungen finden Sie unter Konfigurieren von SQL Server-Datenbank-Engine zum Verschlüsseln von Verbindungen.
- Wenn Sie eine Verbindung über eine IP-Adresse oder einen Alias herstellen, der nicht mit dem Subjektnamen oder dem Subject Alternative Name (SAN) des Zertifikats übereinstimmt, fügen Sie
HostNameInCertificate=<name-from-certificate>zuextra_paramshinzu.
Informationen zur lokalen Entwicklung mit einem selbstsignierten Zertifikat finden Sie unter TrustServerCertificate im Abschnitt Zusätzliche ODBC-Parameter.
Sie können den Treiber explizit angeben:
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",
},
},
}
Unter Linux können Sie auch den vollständigen Pfad zur Treiberbibliothek angeben:
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
Sie können eine Verbindung mit einem HOST Namen oder einem benannten DSN (Datenquellenname) herstellen.
Verbindung mit HOST herstellen
Die meisten Konfigurationen verwenden die HOST Einstellung direkt:
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",
},
},
}
Herstellen einer Verbindung mit DSN
Verwenden Sie einen benannten DSN, der in Ihren ODBC-Datenquellen konfiguriert ist:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"OPTIONS": {
"dsn": "MyDataSourceName",
},
},
}
FreeTDS-Unterstützung
Wenn Sie FreeTDS als ODBC-Treiber verwenden möchten, setzen Sie host_is_server auf True. Dadurch wird dem Backend mitgeteilt, HOST und PORT direkt zu verwenden, anstatt in freetds.conf nach einem Datenservernamen zu suchen:
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,
},
},
}
Weitere Informationen zu DSN-losen Verbindungen mit FreeTDS finden Sie im FreeTDS-Benutzerhandbuch.
Zusätzliche ODBC-Parameter
Verwenden Sie extra_params, um zusätzliche Parameter für die ODBC-Verbindungszeichenfolge zu übergeben. Der Wert ist eine durch Semikolons getrennte Zeichenfolge, die an die Verbindungszeichenfolge angefügt wird:
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",
},
},
}
Diese Einstellung wird auch für Microsoft Entra Authentifizierungstichwörter verwendet.
Vorsicht
Verwenden Sie TrustServerCertificate=yes nur für die lokale Entwicklung mit selbstsignierten Zertifikaten. Verwenden Sie sie nicht in der Produktion. Dadurch wird die Validierung der Zertifikatskette deaktiviert und das Risiko eines Man-in-the-Middle-Angriffs erhöht. Installieren Sie ein vertrauenswürdiges Zertifikat auf dem Server, und stellen Sie eine Verbindung mit TrustServerCertificate=no.
Verbindungstimeouts und Wiederholungen
Konfigurieren der Verbindungsresilienz mit Timeout- und Wiederholungseinstellungen:
| Auswahl | Vorgabe | Description |
|---|---|---|
connection_timeout |
0 (deaktiviert) |
Maximale Anzahl an Sekunden, die auf eine Verbindung gewartet wird. |
connection_retries |
5 |
Anzahl der Wiederholungsversuche bei Verbindungsfehlern. |
connection_retry_backoff_time |
5 |
Wartezeit in Sekunden zwischen den Wiederholungsversuchen. |
query_timeout |
0 (deaktiviert) |
Maximale Anzahl von Sekunden, bis eine Abfrage abgeschlossen ist. |
Beispiel:
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,
},
},
}
Sortierung
Festlegen einer benutzerdefinierten Sortierung für Textfeld-Nachschlagevorgänge:
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",
},
},
}
Mehrere Datenbankverbindungen
Django unterstützt gleichzeitig eine Verbindung mit mehreren Datenbanken. Dies ist nützlich zum Lesen von Replikaten, datenbankübergreifenden Abfragen oder zum Trennen von Workloads nach Isolationsebene.
Konfigurieren mehrerer Datenbanken
Definieren Sie jede Verbindung in der DATABASES Einstellung:
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",
},
},
}
Vorsicht
READ UNCOMMITTED erlaubt schmutzige Lesevorgänge. Verwenden Sie diese Isolationsstufe nur für Berichte oder Analyseabfragen, bei denen absolute Genauigkeit nicht erforderlich ist. Weitere Informationen finden Sie unter Transaktionsverwaltung.
Weiterleiten von Abfragen mit einem Datenbankrouter
Erstellen Sie einen Datenbankrouter, um Lese- und Schreibvorgänge an die entsprechende Verbindung zu leiten:
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"
Registrieren Sie den Router in settings.py:
DATABASE_ROUTERS = ["myproject.routers.ReadReplicaRouter"]
Speichern Sie die Router-Klasse in einer Datei wie myproject/routers.py.
Direktes Abfragen einer bestimmten Datenbank
Verwenden Sie die using() Methode, um einen bestimmten Datenbankalias abzufragen:
# 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)
Weitere Informationen zu Isolationsstufen für Datenbanken pro Verbindung finden Sie unter Lesen von Daten ohne Blockieren.