Připojení a dotazování služby Azure SQL Database pomocí Pythonu a ovladače pyodbc

Platí pro:Azure SQL Database

Tento rychlý start popisuje, jak připojit aplikaci k databázi ve službě Azure SQL Database a provádět dotazy pomocí Pythonu a ovladače SQL Pythonu – pyodbc. Tento rychlý start se řídí doporučeným přístupem bez hesla pro připojení k databázi. Další informace o připojeních bez hesel najdete v centru bez hesel.

Požadavky

  • Předplatné Azure
  • Databáze Azure SQL nakonfigurovaná s ověřováním Microsoft Entra. Můžete ji vytvořit pomocí rychlého startu Pro vytvoření databáze.
  • Nejnovější verze Azure CLI.
  • Visual Studio Code s rozšířením Pythonu
  • Python 3.8 nebo novější Pokud používáte klientský počítač s Linuxem, přečtěte si téma Instalace ovladače ODBC.

Konfigurace databáze

Zabezpečená bez hesla připojení ke službě Azure SQL Database vyžadují určité konfigurace databáze. Ověřte na logickém serveru v Azure následující nastavení, abyste se mohli správně připojit ke službě Azure SQL Database v místním i hostovaným prostředí:

  1. V případě místních vývojových připojení se ujistěte, že je váš logický server nakonfigurovaný tak, aby umožňoval připojení IP adresy místního počítače a dalších služeb Azure:

    • Přejděte na stránku Sítě vašeho serveru.

    • Přepněte přepínač Vybrané sítě, aby se zobrazily další možnosti konfigurace.

    • Vyberte Přidat adresu IPv4 klienta (xx.xx.xx.xx) a přidejte pravidlo brány firewall, které povolí připojení z adresy IPv4 místního počítače. Případně můžete také vybrat + Přidat pravidlo brány firewall a zadat konkrétní IP adresu podle vašeho výběru.

    • Ujistěte se, že je zaškrtnuté políčko Povolit službám a prostředkům Azure přístup k tomuto serveru .

      Snímek obrazovky znázorňující, jak nakonfigurovat pravidla brány firewall

      Upozorňující

      Povolení přístupu ke službám a prostředkům Azure pro přístup k tomuto nastavení serveru není doporučeným postupem zabezpečení pro produkční scénáře. Skutečné aplikace by měly implementovat bezpečnější přístupy, jako jsou silnější omezení brány firewall nebo konfigurace virtuální sítě.

      Další informace o konfiguracích zabezpečení databáze najdete v následujících zdrojích informací:

  2. Server musí mít také povolené ověřování Microsoft Entra a musí mít přiřazený účet správce Microsoft Entra. Pro místní vývojová připojení by měl být účet správce Microsoft Entra účtem, ke kterým se můžete také přihlásit do sady Visual Studio nebo Azure CLI místně. Můžete ověřit, zda má váš server povolené ověřování Microsoft Entra na stránce Microsoft Entra ID vašeho logického serveru.

    Snímek obrazovky znázorňující povolení ověřování Microsoft Entra

  3. Pokud používáte osobní účet Azure, ujistěte se, že máte nastavené a nakonfigurované Microsoft Entra pro Azure SQL Database , abyste mohli účet přiřadit jako správce serveru. Pokud používáte podnikový účet, Bude pro vás pravděpodobně již nakonfigurované ID Microsoft Entra.

Vytvoření projektu

Vytvořte nový projekt Pythonu pomocí editoru Visual Studio Code.

  1. Otevřete Visual Studio Code a vytvořte novou složku pro projekt a změňte adresář na něj.

    mkdir python-sql-azure
    cd python-sql-azure
    
  2. Vytvořte pro aplikaci virtuální prostředí.

    py -m venv .venv
    .venv\scripts\activate
    
  3. Vytvořte nový soubor Pythonu s názvem app.py.

Instalace ovladače pyodbc

Pokud se chcete připojit ke službě Azure SQL Database pomocí Pythonu pyodbc , nainstalujte ovladač. Tento balíček funguje jako zprostředkovatel dat pro připojení k databázím, spouštění příkazů a načítání výsledků. V tomto rychlém startu také nainstalujete flask, uvicorna pydantic balíčky pro vytvoření a spuštění rozhraní API.

Podrobnosti a konkrétní pokyny pro instalaci pyodbc ovladače do všech operačních systémů najdete v tématu Konfigurace vývojového prostředí pro vývoj pyodbc Pythonu.

  1. Vytvořte soubor requirements.txt s následujícími řádky:

    pyodbc
    fastapi
    uvicorn[standard]
    pydantic
    azure-identity
    
  2. Nainstalujte požadavky.

    pip install -r requirements.txt
    

Konfigurace místního připojovací řetězec

Pro místní vývoj a připojení ke službě Azure SQL Database přidejte následující AZURE_SQL_CONNECTIONSTRING proměnnou prostředí. <database-server-name> Nahraďte zástupné <database-name> symboly vlastními hodnotami. Ukázkové proměnné prostředí se zobrazují pro prostředí Bash.

Interaktivní ověřování poskytuje možnost bez hesla, když používáte místně.

Ve Windows může Microsoft Entra Interactive Authentication použít vícefaktorové ověřovací technologie Microsoft Entra k nastavení připojení. V tomto režimu se aktivuje dialogové okno ověřování Azure zadáním přihlašovacího ID a umožní uživateli zadat heslo k dokončení připojení.

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'

Další informace naleznete v tématu Použití Rozhraní Microsoft Entra ID s ovladačem ODBC. Pokud použijete tuto možnost, vyhledejte okno s výzvou k zadání přihlašovacích údajů.

Podrobnosti o vytvoření připojovací řetězec můžete získat z webu Azure Portal:

  1. Přejděte na Azure SQL Server, vyberte stránku databáze SQL a vyhledejte název databáze a vyberte databázi.

  2. V databázi přejděte na stránku Připojení ionových řetězců a získejte připojovací řetězec informace. Prohlédněte si kartu ODBC .

Poznámka:

Pokud jste nainstalovali Azure Arc a přidružili ho k předplatnému Azure, můžete také použít přístup spravované identity zobrazený pro aplikaci nasazenou do služby App Service.

Přidání kódu pro připojení ke službě Azure SQL Database

Ve složce projektu vytvořte soubor app.py a přidejte vzorový kód. Tento kód vytvoří rozhraní API, které:

  • Načte připojovací řetězec Azure SQL Database z proměnné prostředí.
  • Persons Vytvoří tabulku v databázi během spouštění (pouze pro testovací scénáře).
  • Definuje funkci pro načtení všech Person záznamů z databáze.
  • Definuje funkci pro načtení jednoho Person záznamu z databáze.
  • Definuje funkci pro přidání nových Person záznamů do databáze.
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

Upozorňující

Ukázkový kód zobrazuje nezpracované příkazy SQL, které by se neměly používat v produkčním kódu. Místo toho použijte balíček ORM (Object Relational Mapper), jako je SqlAlchemy , který vygeneruje bezpečnější vrstvu objektu pro přístup k databázi.

Místní spuštění a otestování aplikace

Aplikace je připravená k místnímu otestování.

  1. Spusťte soubor v editoru app.py Visual Studio Code.

    uvicorn app:app --reload
    
  2. Na stránce Swagger UI aplikace http://127.0.0.1:8000/docsrozbalte metodu POST a vyberte Vyzkoušet.

    Pomocí příkazu try /redoc můžete také zobrazit jinou formu vygenerované dokumentace pro rozhraní API.

  3. Upravte ukázkový KÓD JSON tak, aby obsahoval hodnoty pro křestní jméno a příjmení. Vyberte Spustit a přidejte do databáze nový záznam. Rozhraní API vrátí úspěšnou odpověď.

  4. Rozbalte metodu GET na stránce uživatelského rozhraní Swagger a vyberte Vyzkoušet. Zvolte Spustit a osoba, kterou jste právě vytvořili, se vrátí.

Nasazení do Azure App Service

Aplikace je připravená k nasazení do Azure.

  1. Vytvořte soubor start.sh tak, aby gunicorn v Aplikace Azure Service mohl spustit uvicorn. Start.sh má jeden řádek:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
    
  2. Pomocí příkazu az webapp up nasaďte kód do služby App Service. (Pomocí této možnosti -dryrun můžete zjistit, co příkaz dělá bez vytvoření prostředku.)

    az webapp up \
        --resource-group <resource-group-name> \
        --name <web-app-name>         
    
  3. Pomocí příkazu az webapp config set nakonfigurujte službu App Service tak, aby používala soubor start.sh.

    az webapp config set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --startup-file start.sh
    
  4. Pomocí příkazu az webapp identity assign povolte spravovanou identitu přiřazenou systémem pro službu App Service.

    az webapp identity assign \
        --resource-group <resource-group-name> \
        --name <web-app-name>
    

    V tomto rychlém startu se pro demonstraci používá spravovaná identita přiřazená systémem. Spravovaná identita přiřazená uživatelem je efektivnější v širším rozsahu scénářů. Další informace najdete v doporučeních k osvědčeným postupům spravované identity. Příklad použití spravované identity přiřazené uživatelem s pyodbcem najdete v tématu Migrace aplikace v Pythonu pro použití bez hesel s Azure SQL Database.

Připojení App Service do Azure SQL Database

V části Konfigurace databáze jste nakonfigurovali sítě a ověřování Microsoft Entra pro server databáze Azure SQL. V této části dokončíte konfiguraci databáze a nakonfigurujete službu App Service s připojovací řetězec pro přístup k databázovému serveru.

Ke spuštění těchto příkazů můžete použít libovolný nástroj nebo integrované vývojové prostředí , které se můžou připojit ke službě Azure SQL Database, včetně sql Server Management Studia (SSMS), Azure Data Studia a editoru Visual Studio Code s rozšířením MSsql SQL Serveru. Můžete také použít Azure Portal, jak je popsáno v rychlém startu: Dotazování služby Azure SQL Database pomocí editoru dotazů na webu Azure Portal.

  1. Přidejte uživatele do služby Azure SQL Database pomocí příkazů SQL pro vytvoření uživatele a role pro přístup bez hesla.

    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>]
    

    Další informace najdete v tématu Uživatelé databáze s omezením – zajištění přenositelnosti databáze. Příklad, který ukazuje stejný princip, ale použitý na virtuální počítač Azure, najdete v kurzu : Použití spravované identity přiřazené systémem na virtuálním počítači s Windows pro přístup k Azure SQL. Další informace o přiřazených rolích naleznete v tématu Pevné databázové role.

    Pokud zakážete a potom povolíte spravovanou identitu přiřazenou systémem služby App Service, pak uživatele zahoďte a znovu ji vytvořte. Spusťte a spusťte DROP USER [<web-app-name>] příkazy znovu CREATEALTER . Pokud chcete zobrazit uživatele, použijte SELECT * FROM sys.database_principals.

  2. Pomocí příkazu az webapp config appsettings set přidejte nastavení aplikace pro připojovací řetězec.

    az webapp config appsettings set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --settings AZURE_SQL_CONNECTIONSTRING="<connection-string>"
    

    U nasazené aplikace by se připojovací řetězec měla podobat:

    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
    

    <dabaser-server-name> Vyplňte hodnoty a <database-name> zadejte je.

    Připojovací řetězec bez hesla neobsahuje uživatelské jméno ani heslo. Místo toho, když aplikace běží v Azure, kód používá DefaultAzureCredential z knihovny identit Azure k získání tokenu pro použití s pyodbc.

Otestování nasazené aplikace

Přejděte na adresu URL aplikace a otestujte, že funguje připojení ke službě Azure SQL Database. Adresu URL aplikace najdete na stránce přehledu služby App Service.

https://<web-app-name>.azurewebsites.net

Připojte /docs k adrese URL, abyste viděli uživatelské rozhraní Swagger a otestování metod rozhraní API.

Gratulujeme! Vaše aplikace je teď připojená ke službě Azure SQL Database v místním i hostovaným prostředí.