Połączenie do usługi Azure SQL Database i wykonywania zapytań względem usługi Azure SQL Database przy użyciu języka Python i sterownika pyodbc

Dotyczy:Azure SQL Database

W tym przewodniku Szybki start opisano sposób łączenia aplikacji z bazą danych w usłudze Azure SQL Database i wykonywania zapytań przy użyciu języka Python i sterownika SQL Języka Python — pyodbc. Ten przewodnik Szybki start jest zgodny z zalecanym podejściem bez hasła w celu nawiązania połączenia z bazą danych. Więcej informacji na temat połączeń bez hasła można uzyskać w centrum bez hasła.

Wymagania wstępne

Konfigurowanie bazy danych

Bezpieczne, bez hasła połączenia z usługą Azure SQL Database wymagają pewnych konfiguracji bazy danych. Sprawdź następujące ustawienia na serwerze logicznym na platformie Azure , aby prawidłowo nawiązać połączenie z usługą Azure SQL Database w środowiskach lokalnych i hostowanych:

  1. W przypadku lokalnych połączeń programistycznych upewnij się, że serwer logiczny jest skonfigurowany tak, aby zezwolić na nawiązywanie połączenia z adresem IP komputera lokalnego i innymi usługami platformy Azure:

    • Przejdź do strony Sieć serwera.

    • Przełącz przycisk radiowy Wybrane sieci, aby wyświetlić dodatkowe opcje konfiguracji.

    • Wybierz pozycję Dodaj adres IPv4 klienta (xx.xx.xx.xx.xx ), aby dodać regułę zapory, która umożliwi połączenia z adresu IPv4 komputera lokalnego. Alternatywnie możesz również wybrać pozycję + Dodaj regułę zapory, aby wprowadzić wybrany konkretny adres IP.

    • Upewnij się, że pole wyboru Zezwalaj usługom i zasobom platformy Azure na dostęp do tego serwera jest zaznaczone.

      Zrzut ekranu przedstawiający sposób konfigurowania reguł zapory.

      Ostrzeżenie

      Włączenie opcji Zezwalaj usługom i zasobom platformy Azure na dostęp do tego ustawienia serwera nie jest zalecaną praktyką zabezpieczeń w scenariuszach produkcyjnych. Rzeczywiste aplikacje powinny implementować bezpieczniejsze podejścia, takie jak silniejsze ograniczenia zapory lub konfiguracje sieci wirtualnej.

      Więcej informacji na temat konfiguracji zabezpieczeń bazy danych można uzyskać w następujących zasobach:

  2. Serwer musi również mieć włączone uwierzytelnianie Microsoft Entra i mieć przypisane konto administratora firmy Microsoft Entra. W przypadku lokalnych połączeń programistycznych konto administratora firmy Microsoft Entra powinno być kontem, które można również zalogować się do programu Visual Studio lub interfejsu wiersza polecenia platformy Azure lokalnie. Możesz sprawdzić, czy serwer ma włączone uwierzytelnianie firmy Microsoft Entra na stronie Identyfikator entra firmy Microsoft serwera logicznego.

    Zrzut ekranu przedstawiający sposób włączania uwierzytelniania w usłudze Microsoft Entra.

  3. Jeśli używasz osobistego konta platformy Azure, upewnij się, że masz konfigurację usługi Microsoft Entra i skonfigurowaną dla usługi Azure SQL Database w celu przypisania konta jako administratora serwera. Jeśli używasz konta firmowego, identyfikator Firmy Microsoft najprawdopodobniej zostanie już skonfigurowany.

Tworzenie projektu

Utwórz nowy projekt w języku Python przy użyciu programu Visual Studio Code.

  1. Otwórz program Visual Studio Code i utwórz nowy folder dla projektu i zmień w nim katalog.

    mkdir python-sql-azure
    cd python-sql-azure
    
  2. Utwórz środowisko wirtualne dla aplikacji.

    py -m venv .venv
    .venv\scripts\activate
    
  3. Utwórz nowy plik w języku Python o nazwie app.py.

Instalowanie sterownika pyodbc

Aby nawiązać połączenie z usługą Azure SQL Database przy użyciu języka Python, zainstaluj pyodbc sterownik. Ten pakiet działa jako dostawca danych do nawiązywania połączenia z bazami danych, wykonywania poleceń i pobierania wyników. W tym przewodniku Szybki start zainstalujesz flaskrównież pakiety , uvicorni pydantic w celu utworzenia i uruchomienia interfejsu API.

Aby uzyskać szczegółowe informacje i szczegółowe instrukcje dotyczące instalowania pyodbc sterownika we wszystkich systemach operacyjnych, zobacz Konfigurowanie środowiska deweloperskiego na potrzeby programowania w języku Python pyodbc.

  1. Utwórz plik requirements.txt z następującymi wierszami:

    pyodbc
    fastapi
    uvicorn[standard]
    pydantic
    azure-identity
    
  2. Zainstaluj wymagania.

    pip install -r requirements.txt
    

Konfigurowanie parametry połączenia lokalnego

W przypadku programowania lokalnego i nawiązywania połączenia z usługą Azure SQL Database dodaj następującą AZURE_SQL_CONNECTIONSTRING zmienną środowiskową. <database-server-name> Zastąp symbole zastępcze i <database-name> własnymi wartościami. Przykładowe zmienne środowiskowe są wyświetlane dla powłoki Bash.

Uwierzytelnianie interakcyjne zapewnia opcję bez hasła w przypadku uruchamiania lokalnego.

W systemie Windows rozwiązanie Microsoft Entra Interactive Authentication może używać technologii uwierzytelniania wieloskładnikowego firmy Microsoft do konfigurowania połączenia. W tym trybie, podając identyfikator logowania, zostanie wyzwolone okno dialogowe uwierzytelniania platformy Azure i umożliwi użytkownikowi wprowadzenie hasła w celu ukończenia połączenia.

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'

Aby uzyskać więcej informacji, zobacz Using Microsoft Entra ID with the ODBC Driver (Używanie identyfikatora Entra firmy Microsoft ze sterownikiem ODBC). Jeśli używasz tej opcji, poszukaj okna z monitem o podanie poświadczeń.

Szczegółowe informacje dotyczące tworzenia parametry połączenia można uzyskać w witrynie Azure Portal:

  1. Przejdź do programu Azure SQL Server, wybierz stronę Bazy danych SQL, aby znaleźć nazwę bazy danych, a następnie wybierz bazę danych.

  2. W bazie danych przejdź do strony ciągów Połączenie ion, aby uzyskać informacje o parametry połączenia. Spójrz na kartę ODBC .

Uwaga

Jeśli zainstalowano usługę Azure Arc i skojarzono ją z subskrypcją platformy Azure, możesz również użyć metody tożsamości zarządzanej pokazanej dla aplikacji wdrożonej w usłudze App Service.

Dodawanie kodu w celu nawiązania połączenia z usługą Azure SQL Database

W folderze projektu utwórz plik app.py i dodaj przykładowy kod. Ten kod tworzy interfejs API, który:

  • Pobiera parametry połączenia usługi Azure SQL Database ze zmiennej środowiskowej.
  • Tworzy tabelę Persons w bazie danych podczas uruchamiania (tylko w przypadku scenariuszy testowania).
  • Definiuje funkcję do pobierania wszystkich Person rekordów z bazy danych.
  • Definiuje funkcję do pobierania jednego Person rekordu z bazy danych.
  • Definiuje funkcję dodawania nowych Person rekordów do bazy danych.
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

Ostrzeżenie

Przykładowy kod przedstawia nieprzetworzone instrukcje SQL, które nie powinny być używane w kodzie produkcyjnym. Zamiast tego użyj pakietu Maper relacyjny obiekt (ORM), takiego jak SqlAlchemy , który generuje bezpieczniejszą warstwę obiektu w celu uzyskania dostępu do bazy danych.

Uruchamianie i testowanie aplikacji lokalnie

Aplikacja jest gotowa do testowania lokalnie.

  1. app.py Uruchom plik w programie Visual Studio Code.

    uvicorn app:app --reload
    
  2. Na stronie Interfejs użytkownika struktury Swagger dla aplikacji http://127.0.0.1:8000/docsrozwiń metodę POST i wybierz pozycję Wypróbuj.

    Możesz również użyć polecenia try /redoc , aby wyświetlić inną formę wygenerowanej dokumentacji interfejsu API.

  3. Zmodyfikuj przykładowy kod JSON, aby uwzględnić wartości dla pierwszego i nazwiska. Wybierz pozycję Wykonaj , aby dodać nowy rekord do bazy danych. Interfejs API zwraca pomyślną odpowiedź.

  4. Rozwiń metodę GET na stronie interfejsu użytkownika programu Swagger i wybierz pozycję Wypróbuj. Wybierz pozycję Wykonaj, a utworzona osoba zostanie zwrócona.

Wdrażanie w usłudze Azure App Service

Aplikacja jest gotowa do wdrożenia na platformie Azure.

  1. Utwórz plik start.sh, aby w usłudze aplikacja systemu Azure Service można było uruchomić uvicorn. Start.sh ma jeden wiersz:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app
    
  2. Użyj polecenia az webapp up , aby wdrożyć kod w usłudze App Service. (Możesz użyć opcji -dryrun , aby zobaczyć, co robi polecenie bez tworzenia zasobu).

    az webapp up \
        --resource-group <resource-group-name> \
        --name <web-app-name>         
    
  3. Użyj polecenia az webapp config set, aby skonfigurować usługę App Service do korzystania z pliku start.sh.

    az webapp config set \
        --resource-group <resource-group-name> \
        --name <web-app-name> \
        --startup-file start.sh
    
  4. Użyj polecenia az webapp identity assign, aby włączyć tożsamość zarządzaną przypisaną przez system dla usługi App Service.

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

    W tym przewodniku Szybki start tożsamość zarządzana przypisana przez system jest używana do pokazu. Tożsamość zarządzana przypisana przez użytkownika jest wydajniejsza w szerszym zakresie scenariuszy. Aby uzyskać więcej informacji, zobacz Zalecenia dotyczące najlepszych rozwiązań dotyczących tożsamości zarządzanych. Aby zapoznać się z przykładem użycia tożsamości zarządzanej przypisanej przez użytkownika za pomocą narzędzia pyodbc, zobacz Migrowanie aplikacji języka Python do używania połączeń bez hasła z usługą Azure SQL Database.

Połączenie usługi App Service do usługi Azure SQL Database

W sekcji Konfigurowanie bazy danych skonfigurowano sieć i uwierzytelnianie firmy Microsoft dla serwera bazy danych Azure SQL Database. W tej sekcji ukończysz konfigurację bazy danych i skonfigurujesz usługę App Service przy użyciu parametry połączenia w celu uzyskania dostępu do serwera bazy danych.

Aby uruchomić te polecenia, możesz użyć dowolnego narzędzia lub środowiska IDE, które może łączyć się z usługą Azure SQL Database, w tym z programem SQL Server Management Studio (SSMS), programem Azure Data Studio i programem Visual Studio Code z rozszerzeniem mssql programu SQL Server. Ponadto możesz użyć witryny Azure Portal zgodnie z opisem w przewodniku Szybki start: użyj edytora zapytań witryny Azure Portal do wykonywania zapytań w usłudze Azure SQL Database.

  1. Dodaj użytkownika do usługi Azure SQL Database za pomocą poleceń SQL, aby utworzyć użytkownika i rolę na potrzeby dostępu bez hasła.

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

    Aby uzyskać więcej informacji, zobacz artykuł Contained Database Users - Making Your Database Portable (Użytkownicy zawartej bazy danych — tworzenie przenośnej bazy danych). Przykład pokazujący tę samą zasadę, ale zastosowaną do maszyny wirtualnej platformy Azure, zobacz Samouczek: używanie przypisanej przez system tożsamości zarządzanej maszyny wirtualnej z systemem Windows w celu uzyskania dostępu do usługi Azure SQL. Aby uzyskać więcej informacji na temat przypisanych ról, zobacz Role stałej bazy danych.

    Jeśli wyłączysz i włączysz tożsamość zarządzaną przypisaną przez system usługi App Service, usuń użytkownika i utwórz go ponownie. Uruchom DROP USER [<web-app-name>] i ponownie uruchom CREATE polecenia i ALTER . Aby wyświetlić użytkowników, użyj polecenia SELECT * FROM sys.database_principals.

  2. Użyj polecenia az webapp config appsettings set, aby dodać ustawienie aplikacji dla parametry połączenia.

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

    W przypadku wdrożonej aplikacji parametry połączenia powinny wyglądać następująco:

    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
    

    Wypełnij wartości <dabaser-server-name> i <database-name> .

    Bez hasła parametry połączenia nie zawiera nazwy użytkownika ani hasła. Zamiast tego, gdy aplikacja działa na platformie Azure, kod używa z DefaultAzureCredentialbiblioteki tożsamości platformy Azure, aby uzyskać token do użycia z usługą pyodbc.

Testowanie wdrożonej aplikacji

Przejdź do adresu URL aplikacji, aby sprawdzić, czy połączenie z usługą Azure SQL Database działa. Adres URL aplikacji można znaleźć na stronie przeglądu usługi App Service.

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

Dołącz /docs do adresu URL, aby wyświetlić interfejs użytkownika struktury Swagger i przetestować metody interfejsu API.

Gratulacje! Aplikacja jest teraz połączona z usługą Azure SQL Database zarówno w środowiskach lokalnych, jak i hostowanych.