Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este guia aborda a configuração do ambiente para programadores de Django que trabalham com o backend mssql-django em Windows, Linux, macOS, contentores Docker, devcontainers e pipelines de CI.
Pré-requisitos
- Python 3.8 ou posterior (o Django 6.0 requer Python 3.12 e versões posteriores)
- Docker Desktop (para desenvolvimento baseado em contentores)
- Microsoft ODBC Driver 17 ou 18 para SQL Server. Veja Descarregar o Driver ODBC para SQL Server.
Local SQL Server com sqlcmd (recomendado)
A utilidade sqlcmd (Go) pode criar um contentor SQL Server num único comando. Trata automaticamente da consulta de imagens Docker, geração de palavra-passe, atribuição de portas e contexto de ligação:
sqlcmd create mssql --accept-eula
Para criar um contentor com uma base de dados de amostras já anexada:
sqlcmd create mssql --accept-eula --using https://aka.ms/AdventureWorksLT.bak
Após a criação, sqlcmd armazena o contexto da ligação para que possas consultar imediatamente:
sqlcmd query "SELECT @@VERSION"
Configure Django para estabelecer ligação usando os dados de ligação que sqlcmd imprimiu aquando da criação. Use sqlcmd config view para os recuperar mais tarde:
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",
},
},
}
Quando terminar, pare ou apague o contentor:
sqlcmd stop
sqlcmd delete
Tip
Execute sqlcmd create mssql --user-database mydb para criar um contentor com uma base de dados de utilizadores vazia, pronta para desenvolvimento.
SQL Server local no Visual Studio Code
A extensão MSSQL para Visual Studio Code pode criar contentores SQL Server locais diretamente a partir do editor:
- Abra a vista SQL Server na Barra de Atividades.
- Selecione Adicionar Ligação>Criar SQL Server Local (ou use a Paleta de Comandos: MS SQL: Criar SQL Server Local).
- Escolha a versão do SQL Server e aceite o EULA.
- A extensão extrai a imagem do contentor, gera uma palavra-passe e adiciona automaticamente um perfil de ligação.
Depois de o contentor estar a correr, pode navegar por bases de dados, fazer consultas e gerir objetos no Visual Studio Code antes de mudar para o seu código Django.
Servidor SQL local com Docker
Se preferir gerir contentores diretamente, a imagem oficial do contentor do SQL Server funciona com duas variáveis de ambiente:
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
Importante
Use MSSQL_SA_PASSWORD para contentores do SQL Server. A variável mais antiga SA_PASSWORD está obsoleta. A palavra-passe deve cumprir os requisitos de complexidade do SQL Server: pelo menos 8 caracteres, com maiúsculas, minúsculas, dígitos e caracteres especiais.
Espere alguns segundos pelo início do contentor e depois execute as migrações:
python manage.py migrate
python manage.py createsuperuser
Dockerfile para aplicações Django
Crie um Dockerfile mínimo para uma aplicação Django que se ligue ao SQL Server. O driver ODBC é a dependência chave que não vem com a imagem base em Python:
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"]
O seu requirements.txt:
django>=5.2
mssql-django>=1.5
gunicorn>=22.0
Construir e executar:
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
Use host.docker.internal no Docker Desktop (Windows e macOS) para aceder a um SQL Server na máquina anfitriã. No Linux, usa --network host em vez disso.
Configuração de devcontainer
Crie um .devcontainer/devcontainer.json do Visual Studio Code que inclua o SQL Server como serviço secundário:
{
"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"
]
}
}
}
Este devcontainer instala o driver ODBC e as dependências de Python, mas não inclui uma instância do SQL Server. Inicie um dentro do devcontainer usando sqlcmd create mssql --accept-eula (já que o Docker-in-Docker está disponível) ou use a abordagem Docker Compose para um serviço SQL Server incorporado.
Crie .devcontainer/post-create.sh para instalar o driver ODBC e as dependências de 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
Incluir SQL Server com Docker Compose
Para incluir o SQL Server como serviço no devcontainer, use o 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: "YourStr0ngP@ssword"
ports:
- "1433:1433"
.devcontainer/devcontainer.json (Versão Compose):
{
"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"
]
}
}
}
Ligue o Django ao serviço SQL Server pelo nome:
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",
},
},
}
Autenticação para desenvolvimento
Escolha uma abordagem de autenticação com base no local onde a sua aplicação corre e onde a base de dados está alojada.
Desenvolvimento local contra SQL do Azure
Para desenvolvimento local com o SQL do Azure, utilize Authentication=ActiveDirectoryDefault em OPTIONS["extra_params"] (com mssql-django 1.7.3 e posteriores, além de um controlador ODBC da Microsoft compatível) ou a definição TOKEN com DefaultAzureCredential.
DefaultAzureCredential retoma automaticamente a sua az login sessão:
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",
},
},
}
Para a matriz completa de autenticação e avisos, veja autenticação Microsoft Entra com mssql-django.
Desenvolvimento de containers contra SQL do Azure
Para contentores em execução no Azure, utilize a definição TOKEN com ManagedIdentityCredential para obter explicitamente um token de acesso do 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": "myserver.database.windows.net",
"PORT": "1433",
"TOKEN": token,
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
},
}
Para uma lista completa de métodos de autenticação, veja autenticação Microsoft Entra com mssql-django.
Configuração de pipeline CI
Executa a tua suite de testes Django contra um contentor de serviços SQL Server no teu pipeline de 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: 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
Para pipelines partilhados, substitua a palavra-passe provisória inline por um segredo encriptado (${{ secrets.SQL_PWD }}) e fixe a imagem do serviço SQL Server num resumo.
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>
settings.py baseado no ambiente
Configura settings.py para ler credenciais de base de dados a partir de variáveis de ambiente. Esta única configuração funciona em desenvolvimento local, Docker e 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"),
},
},
}
Armazenar credenciais num .env ficheiro para desenvolvimento local (adicionar .env a .gitignore):
DB_HOST=localhost
DB_NAME=mydb
DB_USER=<username>
DB_PASSWORD=<password>
Carregar variáveis do ambiente com django-environ ou python-dotenv:
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
Nunca submeta ficheiros .env ao controlo de código-fonte. Adiciona .env ao teu .gitignore ficheiro.
Resolução de problemas com os contentores comuns
| Symptom | Motivo | Corrigir |
|---|---|---|
Can't open lib 'ODBC Driver 18 for SQL Server' |
O driver ODBC não está instalado no contentor. | Instale msodbcsql18 no Dockerfile ou no script de pós-criação. |
| Ligação recusada no porto 1433 | Contentor do SQL Server não está pronto. | Faça um exame de saúde ou espere que o serviço comece. |
Login failed for user '<username>' |
As credenciais estão incorretas ou a palavra-passe não cumpre os requisitos de complexidade. | Use o login SQL correto para o seu contentor e certifique-se de que a palavra-passe cumpre os requisitos de complexidade. |
Cannot open database |
A base de dados ainda não existe. | Crie a base de dados antes de executar migrate, ou use-a master para a configuração inicial. |
| Primeira ligação lenta no contentor | Resolução DNS ou inicialização da cadeia de credenciais. | Para o SQL Server local, use localhost em vez de um nome de host. |
SSL Provider: [error:0A000086] |
Falha na validação do certificado TLS com certificado auto-assinado. | Adicionar TrustServerCertificate=yes a extra_params apenas para desenvolvimento. |