Conectar-se e consultar o Banco de Dados SQL do Azure usando Python e o driver pyodbc
Aplica-se a:Banco de Dados SQL do Azure
Este guia de início rápido descreve como conectar um aplicativo a um banco de dados no Banco de Dados SQL do Azure e executar consultas usando Python e o Python SQL Driver - pyodbc. Este início rápido segue a abordagem sem senha recomendada para se conectar ao banco de dados. Você pode saber mais sobre conexões sem senha no hub sem senha.
Pré-requisitos
- Uma subscrição do Azure.
- Um banco de dados SQL do Azure configurado com autenticação do Microsoft Entra. Você pode criar um usando o início rápido Criar banco de dados.
- A versão mais recente da CLI do Azure.
- Visual Studio Code com a extensão Python.
- Python 3.8 ou posterior.
Configurar o banco de dados
Conexões seguras e sem senha com o Banco de Dados SQL do Azure exigem determinadas configurações de banco de dados. Verifique as seguintes configurações em seu servidor lógico no Azure para se conectar corretamente ao Banco de Dados SQL do Azure em ambientes locais e hospedados:
Para conexões de desenvolvimento local, verifique se o servidor lógico está configurado para permitir que o endereço IP da máquina local e outros serviços do Azure se conectem:
Navegue até a página Rede do seu servidor.
Alterne o botão de opção Redes selecionadas para mostrar opções de configuração adicionais.
Selecione Adicionar o endereço IPv4 do cliente (xx.xx.xx.xx) para adicionar uma regra de firewall que habilitará conexões do endereço IPv4 da máquina local. Como alternativa, você também pode selecionar + Adicionar uma regra de firewall para inserir um endereço IP específico de sua escolha.
Verifique se a caixa de seleção Permitir que os serviços e recursos do Azure acessem este servidor está marcada.
Aviso
Habilitar a configuração Permitir que os serviços e recursos do Azure acessem esse servidor não é uma prática de segurança recomendada para cenários de produção. Aplicativos reais devem implementar abordagens mais seguras, como restrições de firewall mais fortes ou configurações de rede virtual.
Você pode ler mais sobre configurações de segurança de banco de dados nos seguintes recursos:
- Configure as regras de firewall do Banco de Dados SQL do Azure.
- Configure uma rede virtual com pontos de extremidade privados.
O servidor também deve ter a autenticação do Microsoft Entra habilitada e ter uma conta de administrador do Microsoft Entra atribuída. Para conexões de desenvolvimento local, a conta de administrador do Microsoft Entra deve ser uma conta com a qual você também pode fazer logon no Visual Studio ou na CLI do Azure localmente. Você pode verificar se o servidor tem a autenticação do Microsoft Entra habilitada na página ID do Microsoft Entra do servidor lógico.
Se estiver a utilizar uma conta pessoal do Azure, certifique-se de que tem a configuração do Microsoft Entra e configurada para a Base de Dados SQL do Azure para atribuir a sua conta como administrador de servidor. Se você estiver usando uma conta corporativa, o Microsoft Entra ID provavelmente já estará configurado para você.
Criar o projeto
Crie um novo projeto Python usando o Visual Studio Code.
Abra o Visual Studio Code e crie uma nova pasta para seu projeto e altere o diretório para ele.
mkdir python-sql-azure cd python-sql-azure
Crie um ambiente virtual para o aplicativo.
py -m venv .venv .venv\scripts\activate
Crie um novo arquivo Python chamado
app.py
.
Instale o driver pyodbc
Para se conectar ao Banco de Dados SQL do Azure usando Python, instale o pyodbc
driver. Este pacote atua como um provedor de dados para se conectar a bancos de dados, executar comandos e recuperar resultados. Neste início rápido, você também instala flask
o , uvicorn
e pacotes para criar e pydantic
executar uma API.
Para obter detalhes e instruções específicas para instalar o driver em todos os sistemas operacionais, consulte Configurar o pyodbc
ambiente de desenvolvimento para desenvolvimento Python pyodbc.
Crie um arquivo .txt requisitos com as seguintes linhas:
pyodbc fastapi uvicorn[standard] pydantic azure-identity
Instale os requisitos.
pip install -r requirements.txt
Configurar a cadeia de conexão local
Para desenvolvimento local e conexão com o Banco de Dados SQL do Azure, adicione a seguinte AZURE_SQL_CONNECTIONSTRING
variável de ambiente. Substitua os espaços reservados e <database-name>
pelos <database-server-name>
seus próprios valores. Exemplos de variáveis de ambiente são mostrados para o shell Bash.
A autenticação interativa fornece uma opção sem senha quando você está executando localmente.
No Windows, a Autenticação Interativa do Microsoft Entra pode usar a tecnologia de autenticação multifator Microsoft Entra para configurar a conexão. Nesse modo, ao fornecer a ID de entrada, uma caixa de diálogo Autenticação do Azure é acionada e permite que o usuário insira a senha para concluir a conexão.
export AZURE_SQL_CONNECTIONSTRING='Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
Para obter mais informações, consulte Usando o Microsoft Entra ID com o driver ODBC. Se você usar essa opção, procure a janela que solicita credenciais.
Você pode obter os detalhes para criar sua cadeia de conexão no portal do Azure:
Vá para o SQL Server do Azure, selecione a página Bancos de dados SQL para localizar o nome do banco de dados e selecione o banco de dados .
No banco de dados, vá para a página Cadeias de conexão para obter informações sobre a cadeia de conexão. Procure na guia ODBC .
Nota
Se você instalou o Azure Arc e o associou à sua assinatura do Azure, também poderá usar a abordagem de identidade gerenciada mostrada para o aplicativo implantado no Serviço de Aplicativo.
Adicionar código para se conectar ao Banco de Dados SQL do Azure
Na pasta do projeto, crie um arquivo de app.py e adicione o código de exemplo. Este código cria uma API que:
- Recupera uma cadeia de conexão do Banco de Dados SQL do Azure de uma variável de ambiente.
- Cria uma
Persons
tabela no banco de dados durante a inicialização (somente para cenários de teste). - Define uma função para recuperar todos os
Person
registros do banco de dados. - Define uma função para recuperar um
Person
registro do banco de dados. - Define uma função para adicionar novos
Person
registros ao banco de dados.
import os
import pyodbc, struct
from azure import identity
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Person(BaseModel):
first_name: str
last_name: Union[str, None] = None
connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]
app = FastAPI()
@app.get("/")
def root():
print("Root of Person API")
try:
conn = get_conn()
cursor = conn.cursor()
# Table should be created ahead of time in production app.
cursor.execute("""
CREATE TABLE Persons (
ID int NOT NULL PRIMARY KEY IDENTITY,
FirstName varchar(255),
LastName varchar(255)
);
""")
conn.commit()
except Exception as e:
# Table may already exist
print(e)
return "Person API"
@app.get("/all")
def get_persons():
rows = []
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM Persons")
for row in cursor.fetchall():
print(row.FirstName, row.LastName)
rows.append(f"{row.ID}, {row.FirstName}, {row.LastName}")
return rows
@app.get("/person/{person_id}")
def get_person(person_id: int):
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM Persons WHERE ID = ?", person_id)
row = cursor.fetchone()
return f"{row.ID}, {row.FirstName}, {row.LastName}"
@app.post("/person")
def create_person(item: Person):
with get_conn() as conn:
cursor = conn.cursor()
cursor.execute(f"INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)", item.first_name, item.last_name)
conn.commit()
return item
def get_conn():
credential = identity.DefaultAzureCredential(exclude_interactive_browser_credential=False)
token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
SQL_COPT_SS_ACCESS_TOKEN = 1256 # This connection option is defined by microsoft in msodbcsql.h
conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
return conn
Aviso
O código de exemplo mostra instruções SQL brutas, que não devem ser usadas no código de produção. Em vez disso, use um pacote ORM (Object Relational Mapper) como SqlAlchemy que gera uma camada de objeto mais segura para acessar seu banco de dados.
Executar e testar o aplicativo localmente
O aplicativo está pronto para ser testado localmente.
Execute o
app.py
arquivo no Visual Studio Code.uvicorn app:app --reload
Na página Swagger UI do aplicativo http://127.0.0.1:8000/docs, expanda o método POST e selecione Experimentar.
Você também pode usar try /redoc para ver outra forma de documentação gerada para a API.
Modifique o JSON de exemplo para incluir valores para o nome e o sobrenome. Selecione Executar para adicionar um novo registro ao banco de dados. A API retorna uma resposta bem-sucedida.
Expanda o método GET na página Swagger UI e selecione Experimentar. Escolha Executar e a pessoa que você acabou de criar será retornada.
Implementar no Serviço de Aplicações do Azure
O aplicativo está pronto para ser implantado no Azure.
Crie um arquivo start.sh para que o gunicorn no Serviço de Aplicativo do Azure possa executar o uvicorn. O start.sh tem uma linha:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
Use o az webapp para implantar o código no Serviço de Aplicativo. (Você pode usar a opção
-dryrun
para ver o que o comando faz sem criar o recurso.)az webapp up \ --resource-group <resource-group-name> \ --name <web-app-name>
Use o comando az webapp config set para configurar o Serviço de Aplicativo para usar o arquivo start.sh.
az webapp config set \ --resource-group <resource-group-name> \ --name <web-app-name> \ --startup-file start.sh
Use o comando az webapp identity assign para habilitar uma identidade gerenciada atribuída pelo sistema para o Serviço de Aplicativo.
az webapp identity assign \ --resource-group <resource-group-name> \ --name <web-app-name>
Neste início rápido, uma identidade gerenciada atribuída ao sistema é usada para demonstração. Uma identidade gerenciada atribuída ao usuário é mais eficiente em uma ampla gama de cenários. Para obter mais informações, consulte Recomendações de práticas recomendadas de identidade gerenciada. Para obter um exemplo de como usar uma identidade gerenciada atribuída pelo usuário com pyodbc, consulte Migrar um aplicativo Python para usar conexões sem senha com o Banco de Dados SQL do Azure.
Conectar o Serviço de Aplicativo ao Banco de Dados SQL do Azure
Na seção Configurar o banco de dados, você configurou a rede e a autenticação do Microsoft Entra para o servidor de banco de dados SQL do Azure. Nesta seção, você conclui a configuração do banco de dados e configura o Serviço de Aplicativo com uma cadeia de conexão para acessar o servidor de banco de dados.
Para executar esses comandos, você pode usar qualquer ferramenta ou IDE que possa se conectar ao Banco de Dados SQL do Azure, incluindo o SQL Server Management Studio (SSMS), o Azure Data Studio e o Visual Studio Code com a extensão mssql do SQL Server. Além disso, você pode usar o portal do Azure conforme descrito em Guia de início rápido: use o editor de consultas do portal do Azure para consultar o Banco de Dados SQL do Azure.
Adicione um usuário ao Banco de Dados SQL do Azure com comandos SQL para criar um usuário e uma função para acesso sem senha.
CREATE USER [<web-app-name>] FROM EXTERNAL PROVIDER ALTER ROLE db_datareader ADD MEMBER [<web-app-name>] ALTER ROLE db_datawriter ADD MEMBER [<web-app-name>]
Para obter mais informações, veja Contained Database Users - Making Your Database Portable (Utilizadores de Base de Dados Contidos – Tornar a Sua Base de Dados Portátil). Para obter um exemplo que mostra o mesmo princípio, mas aplicado à VM do Azure, consulte Tutorial: Usar uma identidade gerenciada atribuída ao sistema da VM do Windows para acessar o Azure SQL. Para obter mais informações sobre as funções atribuídas, consulte Funções de banco de dados fixo.
Se você desabilitar e habilitar a identidade gerenciada atribuída ao sistema do Serviço de Aplicativo, solte o usuário e recrie-o. Execute
DROP USER [<web-app-name>]
e execute novamente osCREATE
comandos eALTER
. Para ver os usuários, useSELECT * FROM sys.database_principals
.Use o comando az webapp config appsettings set para adicionar uma configuração de aplicativo para a cadeia de conexão.
az webapp config appsettings set \ --resource-group <resource-group-name> \ --name <web-app-name> \ --settings AZURE_SQL_CONNECTIONSTRING="<connection-string>"
Para o aplicativo implantado, a cadeia de conexão deve ser semelhante:
Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30
Preencha o e
<database-name>
com os<dabaser-server-name>
seus valores.A cadeia de conexão sem senha não contém um nome de usuário ou senha. Em vez disso, quando o aplicativo é executado no Azure, o código usa
DefaultAzureCredential
da biblioteca de Identidade do Azure para obter um token para usar compyodbc
o .
Testar o aplicativo implantado
Navegue até a URL do aplicativo para testar se a conexão com o Banco de Dados SQL do Azure está funcionando. Você pode localizar a URL do seu aplicativo na página de visão geral do Serviço de Aplicativo.
https://<web-app-name>.azurewebsites.net
Anexe /docs à URL para ver a interface do usuário do Swagger e testar os métodos da API.
Parabéns! Seu aplicativo agora está conectado ao Banco de Dados SQL do Azure em ambientes locais e hospedados.
Conteúdos relacionados
- Migrar um aplicativo Python para usar conexões sem senha com o Banco de Dados SQL do Azure - Mostra a identidade gerenciada atribuída pelo usuário.
- Conexões sem senha para serviços do Azure
- Recomendações de melhores práticas para identidade geridas