Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten przewodnik obejmuje konfigurację środowiska dla programistów Django pracujących z backendem mssql-django w systemach Windows, Linux i macOS oraz w kontenerach Docker, kontenerach deweloperskich i potokach CI.
Prerequisites
- Python 3.10 do 3.14. Django 6.0 i 6.1 wymagają wersji Python 3.12 i nowszych.
- Docker Desktop (na potrzeby programowania opartego na kontenerach)
- Microsoft ODBC Driver 17 lub 18 do programu SQL Server w przypadku użycia domyślnej ścieżki pyodbc. Zobacz Pobieranie sterownika ODBC dla programu SQL Server.
- Obraz bazowy zgodny z wymaganym
mssql-pythonpakietem: Windows x64, Windows ARM64 z wersjami Python 3.11 i nowszymi, macOS 15 i nowszymi, lub Linux x64/ARM64 z glibc 2.28 i nowszymi wersjami albo musl 1.2 i nowszymi. SUSE Linux na ARM64 nie jest obsługiwany.
Ścieżka mssql-python nie wymaga osobnego sterownika Microsoft ODBC do instalacji SQL Server. Nadal wymaga środowiska uruchomieniowego unixODBC, ponieważ backend importuje moduł pyodbc, gdy Django go wczytuje. Więcej informacji można znaleźć w artykule Wybierz sterownik bazy danych dla mssql-django.
Lokalny SQL Server za pomocą sqlcmd (zalecane)
Narzędzie sqlcmd (Go) może utworzyć kontener SQL Server w jednym poleceniu. Automatycznie obsługuje pobieranie obrazu Dockera, generowanie haseł, przypisywanie portów i kontekst połączenia:
sqlcmd create mssql --accept-eula
Aby utworzyć kontener z już dołączoną przykładową bazą danych:
sqlcmd create mssql --accept-eula --using https://aka.ms/AdventureWorksLT.bak
Po utworzeniu sqlcmd przechowuje kontekst połączenia, dzięki czemu można od razu wykonywać zapytania:
sqlcmd query "SELECT @@VERSION"
Skonfiguruj Django tak, aby łączył się przy użyciu danych połączenia, które sqlcmd wyświetlił podczas tworzenia. Użyj polecenia sqlcmd config view, aby odzyskać je później:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "master",
"USER": "sa",
"PASSWORD": "<password from sqlcmd output>",
"HOST": "localhost",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": "TrustServerCertificate=yes",
},
},
}
Po zakończeniu zatrzymaj lub usuń kontener:
sqlcmd stop
sqlcmd delete
Tip
Uruchom polecenie sqlcmd create mssql --user-database mydb , aby utworzyć kontener z pustą bazą danych użytkownika gotową do programowania.
Lokalny SQL Server w programie Visual Studio Code
Rozszerzenie MSSQL dla Visual Studio Code może tworzyć lokalne kontenery SQL Server bezpośrednio z poziomu edytora:
- Otwórz widok SQL Server na pasku działań.
- Wybierz pozycję Dodaj połączenie>Utwórz lokalne SQL Server (lub użyj palety poleceń: MS SQL: Utwórz lokalny SQL Server).
- Wybierz wersję SQL Server i zaakceptuj umowy EULA.
- Rozszerzenie ściąga obraz kontenera, generuje hasło i automatycznie dodaje profil połączenia.
Po uruchomieniu kontenera można przeglądać bazy danych, uruchamiać zapytania i zarządzać obiektami w Visual Studio Code przed przełączeniem do kodu Django.
Lokalny SQL Server z Dockerem
Jeśli wolisz zarządzać kontenerami bezpośrednio, oficjalny obraz kontenera SQL Server działa z dwiema zmiennymi środowiskowymi:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<strong_password>" \
-p 1433:1433 --name sql1 \
-d mcr.microsoft.com/mssql/server:2022-latest
Ważna
Użyj MSSQL_SA_PASSWORD w przypadku kontenerów SQL Server. Starsza SA_PASSWORD zmienna jest przestarzała. Hasło musi spełniać wymagania dotyczące złożoności SQL Server: co najmniej 8 znaków, z wielkimi literami, małymi literami, cyframi i znakami specjalnymi.
Poczekaj kilka sekund na uruchomienie kontenera, a następnie uruchom migracje:
python manage.py migrate
python manage.py createsuperuser
Plik Dockerfile dla aplikacji Django
Utwórz minimalny Dockerfile dla aplikacji Django, która łączy się z SQL Server przy użyciu domyślnej ścieżki pyodbc. Sterownik ODBC jest kluczową zależnością, która nie pochodzi z obrazu podstawowego Python:
FROM python:3.12-slim
# Install ODBC Driver 18 for SQL Server
RUN apt-get update && \
apt-get install -y --no-install-recommends curl gnupg2 && \
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \
gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg && \
echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main" > \
/etc/apt/sources.list.d/mssql-release.list && \
apt-get update && \
ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql18 unixodbc-dev && \
apt-get purge -y curl gnupg2 && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Collect static files
RUN python manage.py collectstatic --noinput
EXPOSE 8000
CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"]
Ważna
Nie dodawaj apt-get autoremove -y po oczyszczeniu. Usuwa libgssapi-krb5-2, które sterownik ODBC ładuje w czasie działania, ale nie deklaruje jako zależność. Kompilacja nadal kończy się powodzeniem, a potem każde połączenie kończy się niepowodzeniem. Błąd pyodbc jest mylący: wersja 18 nie ładuje się, mssql-django wraca do wersji 17, a błąd nazywa brakującą wersję 17 zamiast wersji 18, która się nie powiodła.
Twój requirements.txt:
django>=5.2,<6.2
mssql-django>=2.0
gunicorn>=22.0
Jeśli alias twojej bazy danych używa ścieżki sterownika mssql-python z "python_driver": "mssql_python", nadal potrzebujesz unixODBC, ponieważ backend importuje pyodbc, gdy Django go ładuje. Nie potrzebujesz repozytorium pakietów Microsoft ani msodbcsql18, więc blok instalacyjny ODBC kurczy się do:
RUN apt-get update && \
apt-get install -y --no-install-recommends unixodbc libkrb5-3 libgssapi-krb5-2 && \
rm -rf /var/lib/apt/lists/*
Kompilowanie i uruchamianie:
docker build -t mydjango .
docker run -e "DB_HOST=host.docker.internal" -e "DB_NAME=<database>" \
-e "DB_USER=<user_id>" -e "DB_PASSWORD=<password>" \
-p 8000:8000 mydjango
Note
Użyj host.docker.internal programu Docker Desktop (Windows i macOS), aby uzyskać dostęp do SQL Server na maszynie hosta. W systemie Linux użyj zamiast tego.--network host
Konfiguracja usługi Devcontainer
Utwórz element .devcontainer/devcontainer.json dla Visual Studio Code, który obejmuje SQL Server jako usługę przyczepki:
{
"name": "Django + SQL Server",
"image": "mcr.microsoft.com/devcontainers/python:3",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"postCreateCommand": "bash .devcontainer/post-create.sh",
"forwardPorts": [1433, 8000],
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-mssql.mssql"
]
}
}
}
Ten devcontainer instaluje sterownik ODBC dla domyślnej ścieżki pyodbc oraz zależności Python, ale nie zawiera instancji SQL Server. Uruchom jedną instancję w devcontainerze przy użyciu sqlcmd create mssql --accept-eula (ponieważ Docker-in-Docker jest dostępny) lub skorzystaj z podejścia Docker Compose, aby użyć wbudowanej usługi SQL Server. Jeśli używasz wariantu mssql-python, zastąp polecenie instalacji msodbcsql18 w skrypcie post-create poleceniem sudo apt-get install -y unixodbc libkrb5-3 libgssapi-krb5-2.
Utwórz .devcontainer/post-create.sh, aby zainstalować sterownik ODBC dla pyodbc oraz zależności języka Python:
#!/bin/bash
set -e
# Install ODBC Driver 18
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \
sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main" | \
sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev
pip install -r requirements.txt
Dołączanie SQL Server za pomocą narzędzia Docker Compose
Aby uwzględnić SQL Server jako usługę w devcontainer, użyj narzędzia Docker Compose:
.devcontainer/docker-compose.yml:
services:
app:
image: mcr.microsoft.com/devcontainers/python:3
volumes:
- ..:/workspace:cached
command: sleep infinity
depends_on:
- db
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
ACCEPT_EULA: "Y"
MSSQL_SA_PASSWORD: "<strong_password>"
ports:
- "1433:1433"
.devcontainer/devcontainer.json (Redaguj wersję):
{
"name": "Django + SQL Server",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspace",
"postCreateCommand": "bash .devcontainer/post-create.sh",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-mssql.mssql"
]
}
}
}
Połącz platformę Django z usługą SQL Server według nazwy:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "mydb",
"USER": "sa",
"PASSWORD": "<password>",
"HOST": "db",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": "TrustServerCertificate=yes",
},
},
}
Uwierzytelnianie na potrzeby programowania
Wybierz metodę uwierzytelniania w zależności od tego, gdzie działa aplikacja i gdzie jest hostowana baza danych.
Lokalne tworzenie aplikacji z użyciem Azure SQL
Do lokalnego programowania z użyciem Azure SQL użyj albo Authentication=ActiveDirectoryDefault w OPTIONS["extra_params"] w ścieżce pyodbc, albo ustawienia TOKEN z DefaultAzureCredential.
DefaultAzureCredential automatycznie pobiera sesję az login :
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
token = credential.get_token("https://database.windows.net/.default").token
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "mydb",
"HOST": "<server>.database.windows.net",
"PORT": "1433",
"TOKEN": token,
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
},
}
Aby zapoznać się z pełną macierzą uwierzytelniania i ostrzeżeniami, zobacz Uwierzytelnianie Microsoft Entra za pomocą mssql-django.
Tworzenie aplikacji kontenerowych dla usługi Azure SQL
W przypadku kontenerów działających na platformie Azure, użyj ustawienia TOKEN wraz z poleceniem ManagedIdentityCredential, aby jawnie uzyskać token dostępu Microsoft Entra:
from azure.identity import ManagedIdentityCredential
credential = ManagedIdentityCredential()
token = credential.get_token("https://database.windows.net/.default").token
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "mydb",
"HOST": "<server>.database.windows.net",
"PORT": "1433",
"TOKEN": token,
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
},
}
Aby uzyskać pełną listę metod uwierzytelniania, zobacz Microsoft Entra uwierzytelnianie za pomocą narzędzia mssql-django.
Konfiguracja potoku ciągłej integracji
Uruchom zestaw testów Django z użyciem kontenera usługi SQL Server w potoku CI.
GitHub Actions
name: Django Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
env:
ACCEPT_EULA: Y
MSSQL_SA_PASSWORD: "<strong_password>"
ports:
- 1433:1433
options: >-
--health-cmd "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P \"$$MSSQL_SA_PASSWORD\" -C -Q 'SELECT 1'"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install ODBC Driver for pyodbc
run: |
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \
sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/prod $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
env:
DB_HOST: localhost
DB_NAME: "master"
DB_USER: "<user_id>"
DB_PASSWORD: "<password>"
run: python manage.py test
Tip
W przypadku współdzielonych potoków zastąp symbol zastępczy hasła umieszczony bezpośrednio w kodzie zaszyfrowanym sekretem (${{ secrets.SQL_PWD }}) i przypnij obraz usługi SQL Server do identyfikatora digest.
Azure Pipelines
trigger:
- main
resources:
containers:
- container: sqlserver
image: mcr.microsoft.com/mssql/server:2022-latest
env:
ACCEPT_EULA: Y
MSSQL_SA_PASSWORD: "<strong_password>"
ports:
- 1433:1433
pool:
vmImage: ubuntu-latest
services:
sqlserver: sqlserver
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: "3.12"
- script: |
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \
sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/prod $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev
pip install -r requirements.txt
displayName: Install dependencies
- script: python manage.py test
displayName: Run tests
env:
DB_HOST: "localhost"
DB_NAME: "master"
DB_USER: "<user_id>"
DB_PASSWORD: "<password>"
Settings.py oparte na środowisku
Skonfiguruj settings.py do odczytu poświadczeń bazy danych ze zmiennych środowiskowych. Ta pojedyncza konfiguracja działa w lokalnym środowisku deweloperskim, Dockerze i CI:
import os
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": os.environ.get("DB_NAME", "mydb"),
"USER": os.environ.get("DB_USER", ""),
"PASSWORD": os.environ.get("DB_PASSWORD", ""),
"HOST": os.environ.get("DB_HOST", "localhost"),
"PORT": os.environ.get("DB_PORT", "1433"),
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": os.environ.get("DB_EXTRA_PARAMS", "TrustServerCertificate=yes"),
},
},
}
Zapisz poświadczenia w pliku .env na potrzeby lokalnego programowania (dodaj .env do .gitignore):
DB_HOST=localhost
DB_NAME=mydb
DB_USER=<user_id>
DB_PASSWORD=<password>
Wczytaj zmienne środowiskowe za pomocą django-environ lub python-dotenv:
pip install django-environ
import environ
env = environ.Env()
environ.Env.read_env() # Reads .env from the directory holding this settings file
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": env("DB_NAME"),
"USER": env("DB_USER", default=""),
"PASSWORD": env("DB_PASSWORD", default=""),
"HOST": env("DB_HOST", default="localhost"),
"PORT": env("DB_PORT", default="1433"),
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": env("DB_EXTRA_PARAMS", default="TrustServerCertificate=yes"),
},
},
}
Caution
Nigdy nie zatwierdzaj plików .env w systemie kontroli wersji. Dodaj .env do .gitignore pliku.
Rozwiązywanie typowych problemów z kontenerem
| Objaw | Przyczyna | Napraw. |
|---|---|---|
Can't open lib 'ODBC Driver 18 for SQL Server' |
Sterownik ODBC dla ścieżki pyodbc nie jest zainstalowany w kontenerze lub apt-get autoremove usunięto libgssapi-krb5-2 po instalacji. |
Zainstaluj msodbcsql18 w pliku Dockerfile lub w skrypcie post-create i nie uruchamiaj później apt-get autoremove. |
Can't open lib 'ODBC Driver 17 for SQL Server' Kiedy instalowałeś wersję 18 |
Wersja 18 jest zarejestrowana, ale nie ładuje się, więc mssql-django wraca do wersji 17, która nie jest zainstalowana. Typową przyczyną jest brak libgssapi-krb5-2. |
Zainstaluj libgssapi-krb5-2, i nie uruchamiaj apt-get autoremove po oczyszczeniu curl. |
Error loading pyodbc module: libodbc.so.2 |
Kontener nie ma środowiska uruchomieniowego unixODBC. Backend importuje pyodbc, gdy Django go ładuje, nawet na ścieżce mssql-python. | Instaluj unixodbc (lub unixodbc-dev). |
DDBC Error: Failed to load the driver |
Sterownik mssql-python nie może ładować własnych zależności. | Zainstaluj libkrb5-3 i libgssapi-krb5-2. |
| Odmowa połączenia na porcie 1433 | SQL Server kontener nie jest gotowy. | Dodaj kontrolę kondycji lub poczekaj na uruchomienie usługi. |
Login failed for user '<user_id>' |
Poświadczenia są nieprawidłowe lub hasło nie spełnia wymagań dotyczących złożoności. Na ścieżce mssql-python baza danych, która nie istnieje, wyświetla ten sam komunikat. | Użyj poprawnego identyfikatora logowania SQL dla kontenera i upewnij się, że hasło spełnia wymagania dotyczące złożoności. Jeśli dane logowania są poprawne, upewnij się, że baza danych w NAME istnieje. |
Cannot open database |
Baza danych jeszcze nie istnieje. Ścieżka pyodbc zgłasza ten przypadek; ścieżka mssql-python zamiast tego zgłasza Login failed. |
Utwórz bazę danych przed uruchomieniem migrate, lub użyj master podczas konfiguracji początkowej. |
| Powolne nawiązywanie pierwszego połączenia w kontenerze | Uruchamianie rozpoznawania nazw DNS lub łańcucha poświadczeń. | W przypadku lokalnego serwera SQL Server użyj localhost zamiast nazwy hosta. |
SSL Provider: [error:0A000086] |
Błąd weryfikacji certyfikatu TLS z użyciem certyfikatu samopodpisanego. | Dodaj TrustServerCertificate=yes do extra_params wyłącznie do celów programistycznych. |