Herstellen einer Verbindung zu Azure SQL-Datenbank und Abfragen der Azure SQL Datenbank mithilfe von Python und dem pyodbc-Treiber
Gilt für: Azure SQL-Datenbank
In dieser Schnellstartanleitung wird beschrieben, wie Sie eine Verbindung einer Anwendung mit einer Datenbank in Azure SQL-Datenbank herstellen und Abfragen mithilfe von Python und dem Python SQL-Treiber pyodbc ausführen. In dieser Schnellstartanleitung wird der empfohlene kennwortlose Ansatz zum Herstellen einer Verbindung mit der Datenbank verwendet. Sie können mehr über kennwortlose Verbindungen auf dem kennwortlosen Hub erfahren.
Voraussetzungen
- Ein Azure-Abonnement.
- Eine Azure SQL-Datenbank, die mit Microsoft Entra-Authentifizierung konfiguriert ist. Sie können zum Erstellen einer Datenbank den Schnellstart zum Erstellen einer Datenbank verwenden.
- Die aktuelle Version der Azure-Befehlszeilenschnittstelle.
- Visual Studio Code mit der Python-Erweiterung.
- Python 3.8 oder höher. Wenn Sie einen Linux-Clientcomputer verwenden, lesen Sie „Installieren des ODBC-Treibers“.
Konfigurieren der Datenbank
Sichere, kennwortlose Verbindungen mit Azure SQL-Datenbank erfordern bestimmte Datenbankkonfigurationen. Überprüfen Sie die folgenden Einstellungen auf Ihrem logischen Server in Azure, um eine ordnungsgemäße Verbindung mit Azure SQL-Datenbank in lokalen und gehosteten Umgebungen herzustellen:
Stellen Sie für Verbindungen bei der lokalen Entwicklung sicher, dass Ihr logischer Server so konfiguriert ist, dass die IP-Adresse Ihres lokalen Computers und andere Azure-Dienste eine Verbindung herstellen können:
Wechseln Sie zur Seite Netzwerk für Ihren Server.
Verwenden Sie das Optionsfeld Ausgewählte Netzwerke, um zusätzliche Konfigurationsoptionen anzuzeigen.
Wählen Sie Client-IPv4-Adresse (xx.xx.xx.xx) hinzufügen aus, um eine Firewallregel hinzuzufügen, die Verbindungen von der IPv4-Adresse Ihres lokalen Computers ermöglicht. Alternativ können Sie auch + Firewallregel hinzufügen auswählen, um eine bestimmte IP-Adresse Ihrer Wahl einzugeben.
Vergewissern Sie sich, dass das Kontrollkästchen Azure-Diensten und -Ressourcen den Zugriff auf diesen Server gestatten aktiviert ist.
Warnung
Das Aktivieren der Einstellung Azure-Diensten und -Ressourcen den Zugriff auf diesen Server gestatten ist kein empfohlenes Sicherheitsverfahren für Produktionsszenarien. Echte Anwendungen sollten sicherere Ansätze implementieren, z. B. stärkere Firewalleinschränkungen oder Konfigurationen mit virtuellen Netzwerken.
Weitere Informationen zum Konfigurieren der Datenbanksicherheit finden Sie in den folgenden Ressourcen:
Der Server muss auch die Microsoft Entra-Authentifizierung aktiviert haben und ein Microsoft Entra-Administratorkonto zugewiesen haben. Bei lokalen Entwicklungsverbindungen sollte das Microsoft Entra-Administratorkonto ein Konto sein, mit dem Sie sich auch lokal bei Visual Studio oder der Azure CLI anmelden können. Sie können überprüfen, ob der Server die Microsoft Entra-Authentifizierung auf der Microsoft Entra-ID-Seite Ihres logischen Servers aktiviert hat.
Wenn Sie ein persönliches Azure-Konto verwenden, stellen Sie sicher, dass Sie Microsoft Entra für Azure SQL Database eingerichtet und konfiguriert haben, um Ihr Konto als Server-Admin zuzuweisen. Wenn Sie ein Unternehmenskonto verwenden, ist die Microsoft Entra ID höchstwahrscheinlich bereits für Sie konfiguriert.
Erstellen des Projekts
Erstellen Sie ein neues Python-Projekt mit Visual Studio Code.
Öffnen Sie Visual Studio Code, erstellen Sie einen neuen Ordner für Ihr Projekt, und wechseln Sie in das Verzeichnis.
mkdir python-sql-azure cd python-sql-azure
Erstellen Sie eine virtuelle Umgebung für die App.
py -m venv .venv .venv\scripts\activate
Erstellen Sie eine neue Python-Datei mit dem Namen
app.py
.
Installieren des pyodbc-Treibers
Installieren Sie den pyodbc
-Treiber, um mithilfe von Python eine Verbindung mit Azure SQL-Datenbank herzustellen. Dieses Paket fungiert als Datenanbieter für das Herstellen einer Verbindung mit Datenbanken, Ausführen von Befehlen und Abrufen von Ergebnissen. In dieser Schnellstartanleitung installieren Sie darüber hinaus flask
-, uvicorn
- und pydantic
-Pakete, um eine API zu erstellen und auszuführen.
Ausführliche Informationen und spezifische Anweisungen zum Installieren des pyodbc
-Treibers auf allen Betriebssystemen finden Sie unter Konfigurieren der Entwicklungsumgebung für die pyodbc Python-Entwicklung.
Erstellen Sie eine requirements.txt-Datei mit folgenden Zeilen:
pyodbc fastapi uvicorn[standard] pydantic azure-identity
Installieren Sie die Anforderungen.
pip install -r requirements.txt
Konfigurieren der lokalen Verbindungszeichenfolge
Fügen Sie für die lokale Entwicklung und das Herstellen einer Verbindung mit Azure SQL-Datenbank die folgende AZURE_SQL_CONNECTIONSTRING
-Umgebungsvariable hinzu. Ersetzen Sie die Platzhalter <database-server-name>
und <database-name>
durch Ihre eigenen Werte. Beispielumgebungsvariablen werden zu der Bash-Shell angezeigt.
Die interaktive Authentifizierung bietet eine kennwortlose Option, wenn die Ausführung lokal erfolgt. Diese Option wird empfohlen, da Sie keine geheimen Authentifizierungsschlüssel im lokalen System speichern oder verwalten müssen.
In Windows kann die interaktive Authentifizierung von Microsoft Entra die Multi-Faktor-Authentifizierung von Microsoft Entra verwenden, um die Verbindung einzurichten. In diesem Modus wird durch Bereitstellen der Anmelde-ID ein Dialogfeld für die Azure-Authentifizierung ausgelöst, das dem Benutzer die Eingabe des Kennworts ermöglicht, um die Verbindung einzurichten.
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'
Weitere Informationen finden Sie unter Verwenden von Microsoft Entra ID mit dem ODBC-Treiber). Wenn Sie diese Option verwenden, suchen Sie nach dem Fenster, in dem Sie zur Eingabe von Anmeldeinformationen aufgefordert werden.
Die Details zum Erstellen der Verbindungszeichenfolge können Sie aus dem Azure-Portal abrufen:
Wechseln Sie zum Azure SQL Server, wählen Sie die Seite SQL-Datenbanken aus, um ihren Datenbanknamen zu finden, und wählen Sie die Datenbank aus.
Navigieren Sie in der Datenbank zur Seite Verbindungszeichenfolgen, um Informationen zur Verbindungszeichenfolge abzurufen. Sehen Sie sich die Registerkarte ODBC an.
Hinweis
Wenn Sie Azure Arc installiert und Ihrem Azure-Abonnement zugeordnet haben, können Sie auch den Ansatz der verwalteten Identität für die App verwenden, die in App Service bereitgestellt wird.
Hinzufügen von Code zum Herstellen einer Verbindung mit einer Azure SQL-Datenbank-Instanz
Erstellen Sie im Projektordner eine app.py-Datei , und fügen Sie den Beispielcode hinzu. Mit diesem Code wird eine API erstellt, die folgendes bewirkt:
- Ruft eine Azure SQL-Datenbank-Verbindungszeichenfolge aus einer Umgebungsvariablen ab.
- Erstellt während des Startvorgangs eine
Persons
-Tabelle in der Datenbank (nur für Testszenarien). - Definiert eine Funktion zum Abrufen aller
Person
-Datensätze aus der Datenbank. - Definiert eine Funktion zum Abrufen eines
Person
-Datensatzes aus der Datenbank. - Definiert eine Funktion zum Hinzufügen neuer
Person
-Datensätze zur Datenbank.
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
Warnung
Der Beispielcode zeigt unformatierte SQL-Anweisungen, die nicht im Produktionscode verwendet werden sollten. Verwenden Sie stattdessen ein Object Relational Mapper-(ORM-)Paket wie z. B. SqlAlchemy, das eine sicherere Objektebene für den Zugriff auf Ihre Datenbank generiert.
Lokales Ausführen und Testen der App
Die App kann lokal getestet werden.
Führen Sie die Datei
app.py
in Visual Studio Code aus.uvicorn app:app --reload
Erweitern Sie auf der Swagger-UI-Seite für die App http://127.0.0.1:8000/docs die POST-Methode, und wählen Sie Ausprobieren aus.
Sie können auch try /redoc verwenden, um eine andere Form der generierten Dokumentation für die API anzuzeigen.
Ändern Sie den JSON-Beispielcode, um Werte für den Vor- und Nachnamen einzuschließen. Wählen Sie Ausführen aus, um der Datenbank einen neuen Datensatz hinzuzufügen. Die API gibt eine Erfolgsmeldung zurück.
Erweitern Sie auf der Swagger-UI-Seite die GET-Methode, und wählen Sie Ausprobieren aus. Wählen Sie Ausführen aus, und die soeben erstellte Person wird zurückgegeben.
Bereitstellung in Azure App Service
Die App kann jetzt in Azure bereitgestellt werden.
Erstellen Sie eine start.sh-Datei, damit gunicorn in Azure App Service uvicorn ausführen kann. Die start.sh-Datei hat eine Zeile:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
Verwenden Sie az webapp up, um den Code in App Service bereitzustellen. (Sie können die Option
-dryrun
verwenden, um die Funktionsweise des Befehls anzuzeigen, ohne die Ressource zu erstellen.)az webapp up \ --resource-group <resource-group-name> \ --name <web-app-name>
Verwenden Sie den Befehl az webapp config set, um App Service für die Verwendung der start.sh-Datei zu konfigurieren.
az webapp config set \ --resource-group <resource-group-name> \ --name <web-app-name> \ --startup-file start.sh
Verwenden Sie den Befehl az webapp identity assign, um eine systemseitig zugewiesene verwaltete Identität für den App Service zu aktivieren.
az webapp identity assign \ --resource-group <resource-group-name> \ --name <web-app-name>
In dieser Schnellstartanleitung wird eine systemseitig zugewiesene verwaltete Identität zu Demonstrationszwecken verwendet. Eine benutzerseitig zugewiesene verwaltete Identität ist in einem breiteren Spektrum von Szenarien effizienter. Weitere Informationen finden Sie unter Empfehlungen zu bewährten Methoden für verwaltete Identitäten. Ein Beispiel für die Verwendung einer benutzerseitig zugewiesenen verwalteten Identität mit pyodbc finden Sie unter Migrieren einer Python-Anwendung zur Verwendung kennwortloser Verbindungen mit Azure SQL-Datenbank.
Verbinden der App Service-Instanz mit Azure SQL-Datenbank
Im Abschnitt Konfigurieren der Datenbank haben Sie Netzwerkbetrieb und Microsoft Entra-Authentifizierung für den Azure SQL-Datenbankserver konfiguriert. In diesem Abschnitt schließen Sie die Datenbankkonfiguration ab und konfigurieren den App Service mit einer Verbindungszeichenfolge für den Zugriff auf den Datenbankserver.
Zum Ausführen dieser Befehle können Sie ein beliebiges Tool oder eine beliebige IDE verwenden, die eine Verbindung mit Azure SQL-Datenbank herstellen kann, einschließlich SQL Server Management Studio (SSMS), Azure Data Studio und Visual Studio Code mit der SQL Server-Erweiterung mssql. Außerdem können Sie das Azure-Portal verwenden, wie unter Schnellstart: Verwenden des Azure-Portal-Abfrage-Editors zum Abfragen der Azure SQL-Datenbank beschrieben.
Fügen Sie der Azure SQL-Datenbank mit SQL-Befehlen einen Benutzer hinzu, um einen Benutzer und eine Rolle für den kennwortlosen Zugriff zu erstellen.
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>]
Weitere Informationen finden Sie unter Eigenständige Datenbankbenutzer - machen Sie Ihre Datenbank portabel. Ein Beispiel, das das gleiche Prinzip zeigt, aber auf Azure VM angewendet wird, finden Sie im Tutorial: Verwenden einer systemseitig zugewiesenen verwalteten Windows-VM-Identität für den Zugriff auf Azure SQL. Weitere Informationen zu den zugewiesenen Rollen finden Sie unter Feste Datenbankrollen.
Wenn Sie den systemseitig zugewiesene verwaltete Identität des App Service deaktivieren und dann aktivieren, löschen Sie den Benutzer, und erstellen Sie ihn neu. Führen Sie
DROP USER [<web-app-name>]
aus und führen Sie die BefehleCREATE
undALTER
erneut aus. Um Benutzer anzuzeigen, verwenden SieSELECT * FROM sys.database_principals
.Verwenden Sie den Befehl az webapp config appsettings set, um eine App-Einstellung für die Verbindungszeichenfolge hinzuzufügen.
az webapp config appsettings set \ --resource-group <resource-group-name> \ --name <web-app-name> \ --settings AZURE_SQL_CONNECTIONSTRING="<connection-string>"
Für die bereitgestellte App sollte die Verbindungszeichenfolge wie folgt aussehen:
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
Geben Sie Ihre Werte in
<dabaser-server-name>
und<database-name>
ein.Die kennwortlose Verbindungszeichenfolge enthält weder einen Benutzernamen noch ein Kennwort. Wenn die App in Azure ausgeführt wird, verwendet der Code stattdessen
DefaultAzureCredential
aus der Azure Identity-Bibliothek, um ein Token für die Verwendung mitpyodbc
abzurufen.
Testen der bereitgestellten Anwendung
Navigieren Sie zur URL der App, um zu testen, ob die Verbindung mit Azure SQL-Datenbank funktioniert. Sie finden die URL Ihrer App auf der App Service-Übersichtsseite.
https://<web-app-name>.azurewebsites.net
Fügen Sie /docs an die URL an, um die Swagger-Benutzeroberfläche anzuzeigen und die API-Methoden zu testen.
Glückwunsch! Ihre Anwendung ist jetzt in lokalen und gehosteten Umgebungen mit Azure SQL-Datenbank verbunden.
Zugehöriger Inhalt
- Migrieren einer Python-Anwendung zur Verwendung kennwortloser Verbindungen mit Azure SQL-Datenbank: Hier wird eine benutzerseitig zugewiesene verwaltete Identität angezeigt.
- Kennwortlose Verbindungen für Azure-Dienste
- Empfehlungen zu bewährten Methoden für verwaltete Identitäten