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.
Diagnostizieren und Beheben häufiger Probleme mit dem mssql-django Back-End für SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance und SQL-Datenbank in Microsoft Fabric.
mssql-django 2.0 unterstützt den Standard-Pyodbc-Treiberpfad und einen opt-in mssql-python-Treiberpfad. Weitere Informationen finden Sie unter Select the database driver for mssql-django.
Verbindungsprobleme
In diesem Abschnitt werden die am häufigsten auftretenden Verbindungsfehler und deren Behebung behandelt.
ODBC-Treiber auf dem pyodbc-Pfad nicht gefunden
Symptome:
django.core.exceptions.ImproperlyConfigured: 'ODBC Driver 18 for SQL Server' is not a recognized ODBC driver
Oder:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server'")
Mögliche Ursachen und Lösungen:
ODBC-Treiber nicht installiert
Installiere den Microsoft ODBC-Treiber für SQL Server, wenn du den Standardpfad von pyodbc verwendest. Downloadlinks finden Sie unter "ODBC-Treiber herunterladen" für SQL Server. Der mssql-python-Pfad verwendet keinen extern installierten ODBC-Treiber.
Mehrere Treiberversionen installiert
Geben Sie den genauen Treibernamen oder Pfad in
settings.py:DATABASES = { "default": { "ENGINE": "mssql", "NAME": "<database>", "USER": "<user_id>", "PASSWORD": "<password>", "HOST": "<server>", "PORT": "1433", "OPTIONS": { "driver": "ODBC Driver 17 for SQL Server", }, }, }Geben Sie unter Linux den vollständigen Pfad an:
"OPTIONS": { "driver": "/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.6.1", },Überprüfen der installierten Treiber
- Führen Sie unter Linux/macOS
odbcinst -q -daus. - Überprüfen Sie auf Windows ODBC-Datenquellen in den Verwaltungstools.
- Führen Sie unter Linux/macOS
mssql-python lehnt eine Verbindungsoption ab
Symptome:
Ein Alias, das "python_driver": "mssql_python" festlegt, schlägt während der Verbindungseinrichtung fehl, nachdem Sie pyodbc-Schlüsselwörter der Verbindungszeichenfolge nach OPTIONS["extra_params"] verschoben haben, und zwar mit einem der folgenden Fehler:
mssql_python.exceptions.ConnectionStringParseError: Connection string parsing failed:
Unknown keyword 'longasmax' is not recognized
mssql_python.exceptions.ConnectionStringParseError: Connection string parsing failed:
Reserved keyword 'driver' is controlled by the driver and cannot be specified by the user
Der Schlüsselwortname in der Nachricht ist in Kleinbuchstaben geschrieben, sodass ein von Ihnen geschriebenes Schlüsselwort LongAsMax als longasmaxerscheint.
ConnectionStringParseError ist nicht Teil der DB-API Ausnahmehierarchie, daher packt Django sie nicht als django.db.utils Fehler neu.
Mögliche Ursachen und Lösungen:
Nur für pyodbc verfügbares Schlüsselwort in
extra_paramsDer mssql-python-Pfad validiert
extra_paramsgegen eine Erlaubnisliste.DRIVERundAPPsind dem Fahrer vorbehalten und liefern dasReserved keywordFormular.DSN,SERVERNAME,MARS_Connectionund nur für pyodbc geltende Schlüsselwörter wieLongAsMax,ColumnEncryption,WSID,QuotedId,AnsiNPW,Regional,UseFMTONLY,Current Language,Description,Network LibraryundConnect Timeoutsind nicht in der Zulassungsliste enthalten und erzeugen die FormUnknown keyword. Entferne das Schlüsselwort oder verwende den Standardpfad pyodbc für ein Alias, das diese ODBC-Option benötigt.Treiberoption soll mssql-python steuern
Der mssql-python-Pfad ignoriert
driver,dsn,host_is_server, undunicode_results.HOSTundPORTwerden zuSERVER=<server>,<port>, und ein leeresHOSTwird zulocalhost.
MSSQL-Python-Abhängigkeit ist zu alt
Symptome:
Ein Alias, der "python_driver": "mssql_python" setzt, schlägt beim Einrichten der Verbindung mit einem dieser Fehler fehl:
django.core.exceptions.ImproperlyConfigured: mssql-python 1.15.0 or newer is required; you have 1.14.0
django.core.exceptions.ImproperlyConfigured: The 'python_driver' connection option requests mssql-python, but the module could not be imported: No module named 'mssql_python'. Install it with 'pip install "mssql-python>=1.15.0"'.
Die zweite Form bedeutet, dass das Modul mssql_python überhaupt nicht importierbar ist.
Lösung: Installieren mssql-python>=1.15.0.
mssql-django 2.0 deklariert mssql-python>=1.15.0, sodass ein normales pip install mssql-django auf unterstützten Plattformen eine kompatible Version ermittelt.
Treiber-17-Fallback gilt nicht für mssql-python
Symptome:
Ein Alias, der "python_driver": "mssql_python" festlegt, schlägt dennoch fehl, obwohl Microsoft ODBC Driver 17 für SQL Server installiert ist.
In diesem Fall gibt es keinen besonderen Fehler. Der mssql-python-Pfad ignoriert die Option driver stillschweigend, sodass die Verbindung mit dem jeweils zugrunde liegenden Fehler fehlschlägt. Wenn du stattdessen den Treibernamen einträgst extra_params , bekommst du eine Fehlermeldung Reserved keyword 'driver' . Siehe mssql-python lehnt eine Verbindungsoption ab.
Lösung: Verwenden Sie den Standardpfad von pyodbc, wenn der Alias einen extern installierten ODBC-Treiber 17 verwenden muss. Der mssql-python-Pfad greift nicht auf Treiber 17 zurück und ignoriert die driver Option. Dieser Pfad benötigt keinen separat installierten ODBC-Treiber.
Verbindung verweigert
Symptome:
django.db.utils.OperationalError: ('08001', '[08001] ... TCP Provider: Error code 0x2749 ...')
Mögliche Ursachen und Lösungen:
TCP/IP ist für SQL Server nicht aktiviert
- Öffnen Sie den SQL Server-Konfigurations-Manager.
- Aktivieren Sie unter SQL Server NetzwerkkonfigurationTCP/IP.
- Aktivieren Sie in den TCP/IP-Eigenschaften die für die Verbindung verwendete IP-Adresse.
- Starten Sie den SQL Server-Dienst neu.
Firewall blockiert Port 1433
- Überprüfen Sie, ob Firewallregeln eingehende Verbindungen an Port 1433 zulassen.
- Fügen Sie für Azure SQL Ihre Client-IP in den Azure Portalfirewalleinstellungen hinzu.
Falscher Servername oder -port
Überprüfen Sie die Werte
HOSTundPORTin Ihrer Konfiguration.
Fehler bei der Anmeldung
Symptome:
django.db.utils.OperationalError: ('28000', "[28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user '<user_id>'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user '<user_id>'. (18456)")
Auf dem mssql-python-Pfad:
django.db.utils.OperationalError: Driver Error: Invalid authorization specification; DDBC Error: [Microsoft][SQL Server]Login failed for user '<user_id>'.
Mögliche Ursachen und Lösungen:
Falsche Anmeldeinformationen
Überprüfen Sie den Benutzernamen und das Kennwort.
Die Datenbank in
NAMEexistiert nichtAuf SQL Server wird der mssql-python-Pfad mit derselben
OperationalErrorNachricht wie bei einem schlechten Passwort angezeigt, sodass die Nachricht allein nicht anzeigt, welches Passwort du getroffen hast. Bestätigen Sie, dass die Datenbank existiert, bevor Sie die Zugangsdaten ändern. Richten SieNAMEaufmaster, um die Anmeldung isoliert zu testen: Wenn die Verbindung hergestellt werden kann, sind die Zugangsdaten korrekt und das Problem liegt bei der Datenbank. Der Pyodbc-Pfad meldet diesen Fall separat alsCannot open database "<database>" requested by the login. The login failed. (4060).Azure SQL-Datenbank berichtet diesen Fall anders. Der mssql-python-Pfad löst
Driver Error: General error; DDBC Error: [Microsoft][SQL Server]Cannot open server "<server>" requested by the login. The login failed.aus. Die Meldung nennt den Server, aber der Servername ist in Ordnung. Prüfen Sie stattdessenNAME.Der Benutzer ist nicht vorhanden.
Vergewissern Sie sich, dass die Anmeldung einem Benutzer in der Zieldatenbank zugeordnet ist.
SQL Server Authentifizierung deaktiviert
Aktivieren Sie die Authentifizierung im gemischten Modus, oder verwenden Sie Windows oder Microsoft Entra Authentifizierung.
Verbindungstimeout
Symptome:
django.db.utils.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 18 for SQL Server]Login timeout expired')
Mögliche Ursachen und Lösungen:
Netzwerklatenz
Erhöhen Sie
connection_timeoutin OPTIONEN.Azure SQL-Datenbank serverlos mit aktivierter automatischer Pause
Eine automatisch pausierte Datenbank wird beim ersten Verbindungsversuch fortgesetzt, und dieser Versuch kann mit dem Fehler 40613 scheitern, während die Datenbank fortgesetzt wird. Stelle
connection_timeoutauf mindestens 60 und versuche die erste Verbindung erneut. Weitere Informationen finden Sie unter Azure SQL-Datenbank serverlos und Automatisches Anhalten und automatisches Fortsetzen.Serverüberladung
Erhöhen Sie
connection_retriesundconnection_retry_backoff_time."OPTIONS": { "driver": "ODBC Driver 18 for SQL Server", "connection_timeout": 30, "connection_retries": 5, "connection_retry_backoff_time": 10, },
Migrationsprobleme
Diese Fehler treten bei Django-Migrationsvorgängen gegen SQL Server auf.
Rohe SQL- und GROUP BY-Probleme
Diese Fehler treten auf, wenn rohe oder annotierte Abfragen mit einer Klausel GROUP BY den Platzhalter-Umschreibungsschritt des Backends durchlaufen.
IndexError bei „GROUP BY“ mit maskierten %%-Parametern
Symptome:
IndexError: Replacement index N out of range for positional args tuple
Die Abfrage funktioniert ohne die GROUP BY Klausel und ohne das entkommene %% Literal, scheitert jedoch, wenn beide zusammen mit einem realen %s Parameter vorhanden sind.
Lösung: Upgrade auf eine aktuelle mssql-django Version. Das Backend schränkt das Platzhalter-Umschreib-Regex auf %% und %s nur ein, sodass entkommene %% Literals wortwörtlich erhalten bleiben und keine Phantom-Platzhalter eingefügt werden.
NotImplementedError für IntegerChoices rohe GROUP BY-Abfragen
Symptome:
NotImplementedError: Not supported type <enum '...'> (StatusChoices.IN_PROGRESS)
Derselbe Enum-Wert funktioniert in ORM-Abfragen und in Rohabfragen ohne GROUP BY, scheitert jedoch, wenn er als Parameter an eine Rohfrage, die eine Klausel GROUP BY enthält, übergeben wird.
Lösung: Upgrade auf eine aktuelle mssql-django Version. Das Backend verwendet isinstance für Parametertypprüfungen im Pfad GROUP BY, sodass IntegerChoices (eine int-Unterklasse) ordnungsgemäß gebunden wird.
bool bindet weiterhin bit, und einfaches int bleibt unverändert.
Probleme mit der Regex-Suche
__regex oder __iregex gibt keine Zeilen zurück
Symptome: Die Abfrage läuft fehlerfrei und liefert eine leere Ergebnismenge, obwohl die Zeilen dem Muster entsprechen.
Product.objects.filter(name__regex=r"^Widget \d+$") # no rows, though "Widget 42" exists
Ursache: dbo.REGEXP_LIKE Ignoriert den buchstäblichen Weißraum im Muster. Das Muster wird so abgeglichen, als wäre es ^Widget\d+$, was von keinem Wert erfüllt werden kann, der ein Leerzeichen enthält. Nichts wird angezeigt, sodass das leere Ergebnis wie ein Datenproblem aussieht.
Lösung: Schreibe Whitespace als Escape oder als Charakterklasse:
Product.objects.filter(name__regex=r"^Widget\s\d+$")
Product.objects.filter(name__regex=r"^Widget[ ]\d+$")
Cannot find ... dbo.REGEXP_LIKE
Symptome:
django.db.utils.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.REGEXP_LIKE", or the name is ambiguous. (4121) (SQLExecDirectW)')
Auf dem mssql-python Pfad:
django.db.utils.ProgrammingError: Driver Error: Syntax error or access violation; DDBC Error: [Microsoft][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.REGEXP_LIKE", or the name is ambiguous.
Ursache: Die CLR-Assembler ist nicht in der Datenbank installiert, die du absprichst. Es wird pro Datenbank installiert, nicht pro Server.
Lösung: Führen Sie python manage.py install_regex_clr <database> für diese Datenbank aus. Führe es erneut aus, nachdem du eine Datenbank gelöscht und neu erstellt hast. Siehe Regex-Lookups einrichten.
Probleme mit Datum und Uhrzeit
Now() Werte werden verschoben, wenn USE_TZ=True
Symptome:
Zeitstempel, die mit Django Now(), auto_now oder auto_now_add geschrieben werden, sind verschoben, wenn die Zeitzone des SQL-Server-Hosts nicht UTC ist.
Lösung: Upgrade auf eine aktuelle mssql-django Version. Das Backend erzeugt zeitzonenfähiges Now() SQL, behält datetimeoffset-Offsets bei und liest Zeitzonendaten über zoneinfo und tzdata.
AttributeError beim Anrufen .explain()
Symptome:
AttributeError: ... explain_format ...
Lösung: Upgrade auf eine aktuelle mssql-django Version. Die Backend-Handles erklären Metadaten für jede unterstützte Django-Version.
AutoField kann nicht geändert werden
Symptome:
django.db.utils.ProgrammingError: Cannot alter column to or from an IDENTITY column
Lösung: SQL Server unterstützt keine Änderung eines Felds von oder zu .AutoField Erstellen Sie ein neues Modell mit dem gewünschten Feldtyp, migrieren Sie die Daten manuell, und legen Sie dann die alte Tabelle ab. Problemumgehungen finden Sie unter Datenbankmigrationen mit mssql-django.
Umbenennen schlägt aufgrund einer Fremdschlüsselbeschränkung fehl
Symptome:
django.db.utils.ProgrammingError: ... could not drop constraint ...
Lösung: SQL Server erfordert das Ablegen von Fremdschlüsseleinschränkungen vor dem Umbenennen von Spalten. Verwenden Sie SeparateDatabaseAndState in Ihrer Migration. Ein Beispiel finden Sie unter Datenbankmigrationen mit mssql-django.
Codierungsprobleme
Kodierungsfehler treten typischerweise auf dem pyodbc-Pfad auf, wenn pyodbc Zeichendaten aus dem SQL Server falsch interpretiert werden.
Unicode-Codierungsfehler
Symptome:
UnicodeDecodeError: 'utf-8' codec can't decode byte ...
Lösung: Konfigurieren Sie die pyodbc-Kodierung im OPTIONS-Wörterbuch. Der mssql-python-Pfad ignoriert unicode_results.
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"unicode_results": True,
},
FreeTDS-Probleme
FreeTDS erfordert eine pyodbc-spezifische Konfiguration, die sich vom Microsoft ODBC-Treiber unterscheidet.
host_is_server Fehler
Symptome:
Verbindung schlägt fehl, wenn FreeTDS ohne Angabe host_is_serververwendet wird.
Lösung: Legen Sie host_is_server auf True fest, wenn Sie FreeTDS verwenden:
"OPTIONS": {
"driver": "FreeTDS",
"host_is_server": True,
},
Weitere Informationen zur FreeTDS-Konfiguration finden Sie unter "Verbindungsoptionen für mssql-django".
Testen von Datenbankproblemen
Die Erstellung und Zerstörung der Testdatenbank kann je nach Authentifizierungsmethode fehlschlagen.
Die Testdatenbank mit verwalteter Identität kann nicht erstellt werden.
Symptome:
django.db.utils.DatabaseError: ('42000', '[42000] ... EXECUTE permission denied on object ...')
Oder:
django.db.utils.OperationalError: ('28000', ... login failed ...)
Der Testläufer kann die Testdatenbank nicht erstellen oder löschen, wenn Sie die ActiveDirectoryMsi-Authentifizierung mit verwalteter Identität verwenden. Diese Einschränkung besteht aus folgenden Gründen:
Anmeldeinformationen für verwaltete Identitäten werden aus der Hostumgebung abgerufen (z. B. Azure VM und App Service).
Der Testläufer versucht, sich beim Teardown mit den Datenbank-Anmeldeinformationen von test zu verbinden.
Einer verwalteten Identität können Rollen auf Datenbankebene zugewiesen werden, aber zum Erstellen und Löschen von Testdatenbanken sind in der Regel Berechtigungen auf Serverebene erforderlich, über die Test-Runner häufig nicht verfügen.
Betroffene Authentifizierungsmethoden:
-
ActiveDirectoryMsi(von Azure verwaltete Identität) -
ActiveDirectoryServicePrincipal(nur bei Konfiguration auf Serverebene)
Unterstützte Authentifizierungsmethoden (Testdatenbankerstellung funktioniert):
ActiveDirectoryPasswordActiveDirectoryIntegrated- SQL-Authentifizierung (Benutzername/Kennwort)
Kompromisse bei der Authentifizierung für Testumgebungen
| Methode | Geheimnislos | Funktioniert mit automatischem Erstellen/Löschen von Test-DBs | Typische Nutzung |
|---|---|---|---|
ActiveDirectoryMsi |
Yes | In der Regel nein (es sei denn, Rechte auf Serverebene werden gewährt) | In Azure gehostete Produktionsworkloads |
ActiveDirectoryServicePrincipal |
Nein (geheimer Clientschlüssel/Zertifikat) | Hängt von den gewährten Rechten auf Serverebene ab | CI/CD mit expliziter Identitätsverwaltung |
ActiveDirectoryPassword |
No | Ja (mit ausreichenden SQL-Berechtigungen) | Entwickler- und kontrollierte CI-Umgebungen |
| SQL-Authentifizierung | No | Ja (mit ausreichenden SQL-Berechtigungen) | Lokale oder isolierte Testumgebungen |
Lösungen:
Für die Entwicklung: Verwenden Sie das Flag
--keepdb, um die Bereinigung der Testdatenbank zu überspringen:python manage.py test --keepdbFür CI/CD-Pipelines: Erstellen Sie eine dedizierte Testdatenbank vorab und gewähren Sie die verwaltete Identität
CREATE TABLEundALTERBerechtigungen:-- Connect as a server admin, then: USE [test_database_name]; -- Grant permissions for managed identity (replace with your identity name) CREATE USER [your-app-identity] FROM EXTERNAL PROVIDER; GRANT CREATE TABLE TO [your-app-identity]; GRANT ALTER ON SCHEMA::dbo TO [your-app-identity];Alternative: Verwenden Sie die SQL-Authentifizierung für Testumgebungen, oder wechseln Sie für CI/CD-Testläufer zu
ActiveDirectoryPassword.
Rollback-Prozeduren
Wenn eine Migration während des Vorgangs fehlschlägt, verwenden Sie diese Rollback-Sequenz, um zu einem bekanntermaßen funktionsfähigen Zustand zurückzukehren:
Beenden Sie Anwendungsschreibvorgänge, um zusätzliche Schemaabweichungen zu vermeiden.
Überprüfen des Migrationsstatus:
python manage.py showmigrations python manage.py sqlmigrate <app_label> <migration_number>Führen Sie einen Rollback auf die letzte bekannte gute Migration durch:
python manage.py migrate <app_label> <previous_migration>Wenn das Schema und die Migrationshistorie voneinander abweichen, korrigieren Sie den Zustand sorgfältig mit
--fake, aber erst, nachdem Sie das tatsächliche Datenbankschema überprüft haben.Führen Sie Migrationen zuerst in einer Staging-Umgebung erneut aus und versuchen Sie es dann in der Produktionsumgebung erneut.
Important
Erstellen Sie vor der Bereitstellung ein getestetes Backup für destruktive Migrationen wie Löschen, Umbenennungen und Änderungen des Spaltentyps. Wenn ein Rollback mittels Migration nicht möglich ist, stellen Sie das System aus einer Sicherung wieder her und wenden Sie die validierten Migrationen erneut an.
Probleme mit Docker und Containern
Container-Images erfordern eine explizite ODBC-Treiberinstallation und Build-Abhängigkeiten, wenn man den Standardpfad von pyodbc verwendet. Der mssql-python-Pfad hat keine separate ODBC-Treiberinstallation, benötigt aber trotzdem die unixODBC-Laufzeit, weil das Backend pyodbc importiert, wenn Django es lädt.
ODBC-Treiber im Container nicht gefunden
Symptome:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server'")
Mögliche Ursachen und Lösungen:
ODBC-Treiber nicht im Containerimage installiert
Schlanke oder Alpine-Basis-Images enthalten den ODBC-Treiber nicht. Füge das Microsoft-APT-Repository hinzu und installiere
msodbcsql18in deinem Dockerfile, wenn du pyodbc verwendest. Ein vollständiges Dockerfile-Beispiel finden Sie unter Deploy to App Service.Fehlendes
unixodbc-devPaketDas
pyodbc-Wheel verbindet sich mitlibodbc.so. Installieren Sieunixodbc-dev(Debian/Ubuntu) oderunixODBC-devel(RHEL/Fedora), bevor Sie Python Pakete installieren.apt-get autoremoveentferntlibgssapi-krb5-2nach der Treiberinstallationmsodbcsql18lädtlibgssapi-krb5-2zur Laufzeit, ohne es als Abhängigkeit zu deklarieren. Die Bibliothek wird in der Regel als Abhängigkeit voncurlinstalliert. Daher wird sie entfernt, wenncurlmit--auto-removevollständig entfernt oder anschließendapt-get autoremoveausgeführt wird. Das Bild baut sich sauber auf und jede Verbindung schlägt dann fehl. Installieren Sielibgssapi-krb5-2explizit, und entfernen Sie es nach der Treiberinstallation nicht automatisch.
Treiber 17 wurde als fehlend gemeldet, als du Version 18 installiert hast
Symptome:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")
In der Fehlermeldung wird Version 17 genannt, aber odbcinst -q -d zeigt Version 18 als registriert an und dpkg -l msodbcsql18 zeigt sie als installiert an.
Ursache: Version 18 ist registriert, lädt aber nicht, sodass mssql-django auf Version 17 zurückfällt, die nicht installiert ist. Der Fallback meldet den Treiber, den er als Zweites versucht hat, nicht den, der fehlgeschlagen ist.
Lösung: Installieren libgssapi-krb5-2 und neu aufbauen. Siehe die vorangehende Anmerkung zu „Autoremove“, wie es dazu kommt, dass die Bibliothek verschwindet.
Fehler beim Laden des pyodbc-Moduls in einem Container
Symptome:
django.core.exceptions.ImproperlyConfigured: Error loading pyodbc module: libodbc.so.2: cannot open shared object file: No such file or directory
Ursache: Das Image hat keine unixODBC-Laufzeit. mssql-django importiert pyodbc, wenn Django das Backend lädt, sodass dieser Fehler auch auf dem mssql-python-Pfad auftritt, bevor eine Verbindung versucht wird.
Lösung: Installieren unixodbc (oder unixodbc-dev).
mssql-python-treiber kann nicht geladen werden
Symptome:
django.db.utils.OperationalError: Driver Error: Connection operation failed; DDBC Error: Failed to load the driver.
Ursache: Der mit mssql-python gelieferte Treiber benötigt die Kerberos-Laufzeitbibliotheken, die in schlanken Basis-Images nicht enthalten sind.
Lösung: Installieren libkrb5-3 und libgssapi-krb5-2.
Pyodbc baut nicht auf schlanken Images auf
Symptome:
error: command 'gcc' failed: No such file or directory
Oder:
fatal error: sql.h: No such file or directory
Lösung: Installieren Sie die Build-Abhängigkeiten vor pip install:
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
unixodbc-dev
Alternativ können Sie einen mehrstufigen Build verwenden, um das endgültige Image klein zu halten:
# Build stage
FROM python:3.12-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ unixodbc-dev
COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
# Runtime stage
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
curl gnupg2 unixodbc \
&& curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \
&& curl -fsSL https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql18 libgssapi-krb5-2 \
&& apt-get purge -y curl gnupg2 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir /wheels/*
Container kann keine Verbindung mit SQL Server herstellen
Symptome:
django.db.utils.OperationalError: ('08001', '... TCP Provider: Error code 0x2749 ...')
Mögliche Ursachen und Lösungen:
Docker Compose-Dienstname nicht als Host verwendet
Wenn Sie Docker Compose verwenden, legen Sie
DB_HOSTden Dienstnamen fest (z. Bdb. ), nichtlocalhostoder127.0.0.1.SQL Server Container nicht bereit
Der SQL Server-Container benötigt mehrere Sekunden zum Starten. Zustandsprüfung oder Startverzögerung hinzufügen:
services: db: image: mcr.microsoft.com/mssql/server:2022-latest healthcheck: test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$$MSSQL_SA_PASSWORD" -No -Q "SELECT 1" || exit 1 # $$ escapes the $ sign in Docker Compose YAML interval: 10s retries: 10 start_period: 10s web: depends_on: db: condition: service_healthyPortzuordnungskonflikte
Wenn eine andere Instanz von SQL Server auf dem Host ausgeführt wird, ändern Sie den verfügbar gemachten Port (z. B
1434:1433. ) und aktualisieren Sie die Django-Konfiguration entsprechend.
Azure SQL vorübergehende Fehlerwiederherstellung
Das mssql-django Back-End erkennt automatisch Azure SQL-Datenbank und Azure SQL Managed Instance Verbindungen durch AbfragenSERVERPROPERTY('EngineEdition'). Beim Betrieb mit Azure SQL versucht das Back-End bei vorübergehenden Fehlern (z. B. vorübergehenden Ressourcenbeschränkungen oder kurzzeitigen Netzwerkunterbrechungen) erneut, eine Verbindung herzustellen.
Sie können dieses Verhalten mit den OPTIONEN connection_retries und connection_retry_backoff_time anpassen:
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"connection_retries": 5,
"connection_retry_backoff_time": 5,
},
Diese Einstellungen gelten nur für die anfängliche Verbindungseinrichtung. Das Backend versucht fehlgeschlagene Abfragen nicht erneut. Wenn eine Abfrage nach dem Herstellen der Verbindung mit einem vorübergehenden Fehler fehlschlägt, wird die Ausnahme an den Anwendungscode weitergegeben. Verwenden Sie die Wiederholungslogik auf Anwendungsebene (z. B. django-retry-db oder eine benutzerdefinierte Middleware) für die Resilienz auf Abfrageebene.
Langsame Abfragen und Planen von Regressionen
Diese Probleme erfordern in der Regel eine serverseitige Analyse sowie eine Überprüfung der Abfragen auf Django-Ebene.
Die Abfrage wird langsamer oder es kommt zu Zeitüberschreitungen.
Symptome:
Dieselbe Abfrage wird im Laufe der Zeit langsamer oder verursacht nach einer Bereitstellung, einer Indexänderung oder einer Aktualisierung von Statistiken Zeitüberschreitungen.
Mögliche Ursachen und Lösungen:
Beginnen Mit integrierten Leistungsberichten
Öffnen Sie für SQL Server und Azure SQL Managed Instance das Performance Dashboard in SQL Server Management Studio. Öffnen Sie für Azure SQL-Datenbank Abfrageleistungsanalyse für Azure SQL-Datenbank. Diese Werkzeuge sind in der Regel ein besserer erster Schritt als Ad-hoc-DMV-Abfragen, da sie teure Abfragen, Wartezeiten und Ressourcenengpässe schnell sichtbar machen.
Planen der Regression
Verwenden Sie Abfragespeicher, um die langsame Abfrage zu finden und zu überprüfen, ob sie über mehrere Pläne verfügt. Beginnen Sie mit den Ansichten "Regressed Queries" und "Top Resource Consuming Queries", die in bewährten Methoden für die Überwachung von Workloads mit Abfragespeicher beschrieben werden.
Ineffizienter Ausführungsplan
Öffnen Sie einen tatsächlichen Ausführungsplan für die Anweisung, und suchen Sie nach Tabellen- oder Indexüberprüfungen, großen Schlüsselsuchen, Hash-Überläufen oder ungenauen Zeilenschätzungen. Hintergrundinformationen finden Sie unter Übersicht über den Ausführungsplan.
Falscher Engpass identifiziert
Wenn die Abfrage nicht CPU-gebunden ist, verwenden Sie Abfragespeicher Wartestatistik, und identifizieren Sie Engpässe, um CPU, Arbeitsspeicher, Datenträger-E/A, Blockierung und Verbindungsdruck zu unterscheiden.
Korrektur auf der falschen Ebene angewendet
Wenden Sie den kleinsten effektiven Fix an: Indizes hinzufügen oder anpassen, Statistiken aktualisieren, ausgewählte Spalten und Zeilen reduzieren oder große Schreibvorgänge stapeln. Wenn Sie eine Sofortmaßnahme benötigen, kann ein DBA vorübergehend einen bekanntermaßen guten Plan im Abfragespeicher erzwingen, während Sie die Grundursache beheben.
Verwenden von dbshell für interaktive Abfragen
Der Verwaltungsbefehl von dbshell Django öffnet eine interaktive SQL-Shell, die mit Ihrer Datenbank verbunden ist:
python manage.py dbshell
Das Backend verwendet sqlcmd, wenn Sie den Microsoft ODBC-Treiber konfigurieren, oder isql, wenn Sie FreeTDS verwenden. Überprüfen Sie, ob das Tool in Ihrem PATH ist:
-
Windows:
sqlcmdist in SQL Server Tools enthalten, oder Sie können sie separat herunterladen. -
Linux und macOS: Installieren
mssql-tools18sie aus dem Microsoft Repository.
Verwandte Inhalte
- mssql-django-Konfigurationsreferenz
- Verbindungsoptionen für mssql-django
- Wiederholungslogik und Verbindungsresilienz mit mssql-django
- Einschränkungen und nicht unterstützte Features in mssql-django
- Leistungsdashboard
- Abfrageleistungserblick für Azure SQL-Datenbank
- Überwachen Sie die Leistung mithilfe des Abfragespeichers
- Analysieren eines tatsächlichen Ausführungsplans
- Problembehandlung für Wiki
- Häufig gestellte Fragen