Tároló- és helyi fejlesztés az mssql-django használatával

Ez az útmutató a Windows, Linux, macOS, Docker-tárolók, devcontainerek és CI-folyamatok háttérrendszerével mssql-django dolgozó Django-fejlesztők környezetbeállításait ismerteti.

Prerequisites

Az sqlcmd (Go) segédprogram egyetlen parancsban hozhat létre SQL Server tárolót. Automatikusan kezeli a Docker-rendszerkép lekérését, a jelszógenerálást, a porthozzárendelést és a kapcsolati környezetet:

sqlcmd create mssql --accept-eula

Tároló létrehozása már csatolt mintaadatbázissal:

sqlcmd create mssql --accept-eula --using https://aka.ms/AdventureWorksLT.bak

A létrehozás után tárolja a kapcsolati környezetet, sqlcmd hogy azonnal lekérdezhesse:

sqlcmd query "SELECT @@VERSION"

Konfigurálja a Django-t a csatlakozáshoz a létrehozáskor kinyomtatott kapcsolati adatokkal sqlcmd . Használja a(z) sqlcmd config view elemet a későbbi lekéréshez:

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

Amikor végzett, állítsa le vagy törölje a konténert:

sqlcmd stop
sqlcmd delete

Tip

Üres felhasználói adatbázissal rendelkező, fejlesztésre kész konténer létrehozásához futtassa a(z) sqlcmd create mssql --user-database mydb parancsot.

Helyi SQL Server a Visual Studio Code-ban

A Visual Studio Code MSSQL-bővítménye közvetlenül a szerkesztőből hozhat létre helyi SQL Server tárolókat:

  1. Nyissa meg a SQL Server nézetet a tevékenységsávon.
  2. Válassza a Kapcsolat hozzáadása>Helyi SQL Server létrehozása lehetőséget (vagy használja a Parancspalettát: MS SQL: Helyi SQL Server létrehozása).
  3. Válassza ki a SQL Server verziót, és fogadja el az EULA-t.
  4. A bővítmény lekéri a tárolórendszerképet, létrehoz egy jelszót, és automatikusan hozzáad egy kapcsolatprofilt.

A tároló futtatása után böngészhet az adatbázisok között, lekérdezéseket futtathat, és kezelheti az objektumokat Visual Studio Code, mielőtt a Django-kódra váltana.

Helyi SQL Server a Dockerrel

Ha inkább közvetlenül szeretné kezelni a tárolókat, a hivatalos SQL Server tárolórendszerkép két környezeti változóval működik:

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourStr0ngP@ssword" \
  -p 1433:1433 --name sql1 \
  -d mcr.microsoft.com/mssql/server:2022-latest

Important

SQL Server tárolókhoz használhatóMSSQL_SA_PASSWORD. A régebbi SA_PASSWORD változó elavult. A jelszónak meg kell felelnie SQL Server összetettségi követelményeknek: legalább 8 karakter, nagybetűvel, kisbetűvel, számjegyekkel és speciális karakterekkel.

Várjon néhány másodpercet, amíg a tároló elindul, majd futtassa az áttelepítéseket:

python manage.py migrate
python manage.py createsuperuser

Dockerfile Django-alkalmazásokhoz

Hozzon létre egy minimális Dockerfile-fájlt egy Django-alkalmazáshoz, amely SQL Server csatlakozik. Az ODBC-illesztő az a kulcsfüggőség, amely nem tartozik az Python alaprendszerképhez:

FROM python:3-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 && \
    apt-get autoremove -y && \
    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"]

Az Ön requirements.txt:

django>=5.2
mssql-django>=1.5
gunicorn>=22.0

Építés és futtatás:

docker build -t mydjango .
docker run -e DB_HOST=host.docker.internal -e DB_NAME=mydb \
  -e DB_USER=<your-username> -e DB_PASSWORD=<your-password> \
  -p 8000:8000 mydjango

Note

A Docker Desktopben (Windows és macOS rendszeren) a host.docker.internal használatával érheti el a gazdagépen futó SQL Servert. Linuxon használja --network host inkább.

Devcontainer beállítása

Hozzon létre egy .devcontainer/devcontainer.json a Visual Studio Code-hoz, amely sidecar szolgáltatásként tartalmazza az SQL Servert:

{
    "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"
            ]
        }
    }
}

Ez a devcontainer telepíti az ODBC-illesztőprogramot és Python függőségeket, de nem tartalmaz SQL Server-példányt. Kezdjen egyet a devcontainerben sqlcmd create mssql --accept-eula (mivel a Docker-in-Docker elérhető), vagy használja a Docker Compose megközelítést egy beépített SQL Server szolgáltatáshoz.

Az ODBC-illesztőprogram és a Python-függőségek telepítéséhez hozza létre a .devcontainer/post-create.sh-t:

#!/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

SQL Server hozzáadása a Docker Compose használatával

Ha szolgáltatásként SQL Server szeretne szerepelni a devcontainerben, használja a Docker Compose-t:

.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: "YourStr0ngP@ssword"
    ports:
      - "1433:1433"

.devcontainer/devcontainer.json (Compose verzió):

{
    "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"
            ]
        }
    }
}

Csatlakoztassa a Django-t a SQL Server szolgáltatáshoz név szerint:

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

Hitelesítés fejlesztéshez

Válasszon hitelesítési módszert az alkalmazás futási helye és az adatbázis üzemeltetése alapján.

Helyi fejlesztés Azure SQL használatával

Az Azure SQL-hez kapcsolódó helyi fejlesztéshez használja vagy a Authentication=ActiveDirectoryDefault elemet a OPTIONS["extra_params"] környezetben (az 1.7.3-as és újabb mssql-django verziókkal, valamint egy kompatibilis Microsoft ODBC-illesztőprogrammal), vagy a TOKEN beállítást a DefaultAzureCredential használatával. DefaultAzureCredential automatikusan folytatja az Ön az login munkamenetét:

from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
token = credential.get_token("https://database.windows.net/.default").token

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "mydb",
        "HOST": "myserver.database.windows.net",
        "PORT": "1433",
        "TOKEN": token,
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

A teljes hitelesítési mátrixot és figyelmeztetéseket az mssql-django Microsoft Entra hitelesítésével kapcsolatban talál.

Konténerfejlesztés Azure SQL-hez

Az Azure-ban futó tárolók esetében a ManagedIdentityCredential használatával explicit módon kérje le a Microsoft Entra hozzáférési jogkivonatot a TOKEN beállítással:

from azure.identity import ManagedIdentityCredential

credential = ManagedIdentityCredential()
token = credential.get_token("https://database.windows.net/.default").token

DATABASES = {
  "default": {
    "ENGINE": "mssql",
    "NAME": "mydb",
    "HOST": "myserver.database.windows.net",
    "PORT": "1433",
    "TOKEN": token,
    "OPTIONS": {
      "driver": "ODBC Driver 18 for SQL Server",
    },
  },
}

A hitelesítési módszerek teljes listáját az mssql-django Microsoft Entra hitelesítésével kapcsolatban találja.

CI-folyamat konfigurálása

Futtassa a Django-tesztcsomagot egy SQL Server szolgáltatástárolón a CI-folyamatban.

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: YourStr0ngP@ssword
        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.x"

      - name: Install ODBC Driver
        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: <username>
          DB_PASSWORD: <password>
        run: python manage.py test

Tip

Megosztott folyamatok esetén cserélje le a beágyazott helyőrző jelszót egy titkosított titkos kódra (${{ secrets.SQL_PWD }}), és rögzítse a SQL Server szolgáltatás rendszerképét egy kivonatba.

Azure Pipelines

trigger:
  - main

resources:
  containers:
    - container: sqlserver
      image: mcr.microsoft.com/mssql/server:2022-latest
      env:
        ACCEPT_EULA: Y
        MSSQL_SA_PASSWORD: YourStr0ngP@ssword
      ports:
        - 1433:1433

pool:
  vmImage: ubuntu-latest

services:
  sqlserver: sqlserver

steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: "3.x"

  - 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: <username>
      DB_PASSWORD: <password>

Környezeti alapú settings.py

Konfigurálja settings.py az adatbázis hitelesítő adatainak beolvasását a környezeti változókból. Ez az egyetlen konfiguráció a helyi fejlesztés, a Docker és a CI területén működik:

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

Hitelesítő adatok tárolása egy .env fájlban helyi fejlesztéshez (hozzáadás .env a következőhöz .gitignore):

DB_HOST=localhost
DB_NAME=mydb
DB_USER=<username>
DB_PASSWORD=<password>

Környezeti változók betöltése django-environ vagy python-dotenv használatával:

pip install django-environ
import environ

env = environ.Env()
environ.Env.read_env()  # Reads .env 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",
        },
    },
}

Caution

Soha ne véglegesítse .env a fájlokat a forrásvezérlőben. Adja hozzá a .env elemet a .gitignore fájljához.

A tárolóval kapcsolatos gyakori problémák elhárítása

Hibajelenség A probléma oka Kijavítás
Can't open lib 'ODBC Driver 18 for SQL Server' Az ODBC-illesztő nincs telepítve a tárolóban. Telepítse a(z) msodbcsql18-t a Dockerfile-ban vagy a létrehozás utáni szkriptben.
A kapcsolat megtagadva az 1433-as porton SQL Server tároló nem áll készen. Adjon hozzá állapotellenőrzést, vagy várja meg, amíg a szolgáltatás elindul.
Login failed for user '<username>' A hitelesítő adatok helytelenek, vagy a jelszó nem felel meg az összetettségi követelményeknek. Használja a megfelelő SQL-bejelentkezést a tárolóhoz, és győződjön meg arról, hogy a jelszó megfelel az összetettségi követelményeknek.
Cannot open database Az adatbázis még nem létezik. Az adatbázist a migrate futtatása előtt hozza létre, vagy a kezdeti beállításhoz használja a master elemet.
Lassú első kapcsolat a tárolóban DNS-feloldás vagy hitelesítőadat-lánc indítása. Helyi SQL Server esetén a gazdagépnév helyett használja a(z) localhost elemet.
SSL Provider: [error:0A000086] TLS-tanúsítványérvényesítési hiba önaláírt tanúsítvány esetén. Adja hozzá a(z) TrustServerCertificate=yes elemet a(z) extra_params elemhez, csak fejlesztéshez.