Freigeben über


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

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:

  1. 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.

      Screenshot: Konfigurieren von Firewallregeln

      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:

  2. 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.

    Ein Screenshot, der das Aktivieren der Microsoft Entra-Authentifizierung anzeigt.

  3. 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.

  1. Ö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
    
  2. Erstellen Sie eine virtuelle Umgebung für die App.

    py -m venv .venv
    .venv\scripts\activate
    
  3. 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.

  1. Erstellen Sie eine requirements.txt-Datei mit folgenden Zeilen:

    pyodbc
    fastapi
    uvicorn[standard]
    pydantic
    azure-identity
    
  2. 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.

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:

  1. 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.

  2. 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.

  1. Führen Sie die Datei app.py in Visual Studio Code aus.

    uvicorn app:app --reload
    
  2. 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.

  3. Ä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.

  4. 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.

  1. 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
    
  2. 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>         
    
  3. 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
    
  4. 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.

  1. 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 Befehle CREATE und ALTER erneut aus. Um Benutzer anzuzeigen, verwenden Sie SELECT * FROM sys.database_principals.

  2. 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 mit pyodbc 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.