Udostępnij przez


Nawiązywanie połączenia z usługą Azure SQL Database i wykonywanie zapytań względem usługi Azure SQL Database przy użyciu języka Python i sterownika mssql-python

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 mssql-python. Sterownik mssql-python ma wbudowaną obsługę uwierzytelniania Entra firmy Microsoft, dzięki czemu połączenia bez hasła są proste. 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 Microsoft Entra powinno być kontem, na które można się zalogować do programu Visual Studio lub lokalnie do interfejsu wiersza polecenia platformy Azure. Możesz sprawdzić, czy serwer ma włączone uwierzytelnianie Microsoft Entra na stronie Microsoft Entra ID swojego 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 skonfigurowaną usługę Microsoft Entra dla usługi Azure SQL Database, aby przypisać swoje konto jako administratora serwera. Jeśli używasz konta firmowego, Microsoft Entra ID najprawdopodobniej jest 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, utwórz nowy folder dla projektu i przejdź do tego katalogu.

    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 mssql-python

Aby nawiązać połączenie z usługą Azure SQL Database przy użyciu języka Python, zainstaluj mssql-python sterownik. Ten sterownik ma wbudowaną obsługę uwierzytelniania firmy Microsoft Entra, eliminując konieczność ręcznej obsługi tokenów. W tym przewodniku szybkiego startu zainstalujesz również pakiety fastapi, uvicorn i pydantic w celu utworzenia i uruchomienia interfejsu API.

Uwaga / Notatka

W systemach macOS i Linux przed zainstalowaniem mssql-pythonprogramu wymagane są zależności systemowe. Aby uzyskać instrukcje specyficzne dla platformy, zobacz Instalowanie pakietu mssql-python .

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

    mssql-python
    fastapi
    uvicorn[standard]
    pydantic
    python-dotenv
    
  2. Zainstaluj wymagania.

    pip install -r requirements.txt
    

Skonfiguruj ciąg połączenia lokalnego

W przypadku lokalnego tworzenia oprogramowania utwórz plik .env w folderze projektu, aby przechowywać ciąg połączenia. Dzięki temu poświadczenia są poza kodem i kontrolą źródła.

  1. W folderze projektu utwórz nowy plik o nazwie .env.

  2. Dodaj zmienną AZURE_SQL_CONNECTIONSTRING z parametrami połączenia. Zastąp symbole zastępcze <database-server-name> i <database-name> własnymi wartościami.

Sterownik mssql-python ma wbudowaną obsługę uwierzytelniania Entra firmy Microsoft. Użyj parametru , Authentication aby określić metodę uwierzytelniania.

ActiveDirectoryDefault automatycznie odnajduje poświadczenia z wielu źródeł bez konieczności logowania interakcyjnego. Jest to zalecana opcja programowania lokalnego.

Aby uzyskać najbardziej niezawodne środowisko programowania lokalnego, najpierw zaloguj się przy użyciu interfejsu wiersza polecenia platformy Azure:

az login

Następnie użyj tego formatu parametrów połączenia w .env pliku:

AZURE_SQL_CONNECTIONSTRING=Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryDefault;Encrypt=yes;TrustServerCertificate=no;

ActiveDirectoryDefault ocenia poświadczenia w następującej kolejności:

  1. Zmienne środowiskowe (dla poświadczeń jednostki usługi)
  2. Tożsamość zarządzana (w przypadku uruchamiania na platformie Azure)
  3. Interfejs wiersza polecenia platformy Azure (z az login)
  4. Visual Studio (tylko system Windows)
  5. Azure PowerShell (z Connect-AzAccount)

Wskazówka

W przypadku aplikacji produkcyjnych użyj określonej metody uwierzytelniania dla danego scenariusza, aby uniknąć opóźnienia odnajdywania poświadczeń:

  • Azure App Service/Functions: użyj ActiveDirectoryMSI (tożsamość zarządzana)
  • Logowanie użytkownika interakcyjnego: użyj polecenia ActiveDirectoryInteractive
  • Usługa główna: użyj ActiveDirectoryServicePrincipal

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 Przegląd , aby uzyskać nazwę serwera.

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:

  • Ładuje konfigurację z pliku .env przy użyciu python-dotenv.
  • 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.
from os import getenv
from typing import Union
from dotenv import load_dotenv
from fastapi import FastAPI
from pydantic import BaseModel
from mssql_python import connect

load_dotenv()

class Person(BaseModel):
    first_name: str
    last_name: Union[str, None] = None

connection_string = getenv("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("""
            IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Persons')
            CREATE TABLE Persons (
                ID int NOT NULL PRIMARY KEY IDENTITY,
                FirstName varchar(255),
                LastName varchar(255)
            );
        """)

        conn.commit()
        conn.close()
    except Exception as e:
        # Table might 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("INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)",
                       (item.first_name, item.last_name))
        conn.commit()

    return item

def get_conn():
    """Connect using mssql-python with built-in Microsoft Entra authentication."""
    conn = connect(connection_string)
    conn.setautocommit(True)
    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 Obiektowy Maper Relacyjny (ORM), takiego jak SqlAlchemy, który generuje bardziej bezpieczną warstwę w celu uzyskania dostępu do Twojej 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 Swagger UI dla aplikacji http://127.0.0.1:8000/docsrozwiń metodę POST i wybierz pozycję Wypróbuj to.

    Możesz również spróbować /redoc 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 Swagger UI i wybierz pozycję Wypróbuj. Wybierz Wykonaj, a osoba, którą właśnie utworzyłeś, 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 gunicorn w usłudze Azure App Service mógł 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 na 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 szybkiego startu do celów demonstracyjnych używana jest tożsamość zarządzana przypisana przez system. 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. Przykład użycia tożsamości zarządzanej przypisanej przez użytkownika w języku mssql-python można znaleźć w temacie Migrate a Python application to use passwordless connections with Azure SQL Database (Migrowanie aplikacji języka Python w celu używania połączeń bez hasła z usługą Azure SQL Database).

Łączenie usługi App Service z usługą 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) i programem Visual Studio Code z rozszerzeniem MSSQL. Możesz również użyć witryny Azure Portal zgodnie z opisem w przewodniku Szybki start: używanie 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>], a następnie ponownie uruchom polecenia CREATE 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 łańcucha 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:

    Server=<database-server-name>.database.windows.net;Database=<database-name>;Authentication=ActiveDirectoryMSI;Encrypt=yes;TrustServerCertificate=no;
    

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

    Parametry połączenia bez hasła nie zawierają nazwy użytkownika ani hasła. Zamiast tego, gdy aplikacja działa na platformie Azure, sterownik mssql-python używa ActiveDirectoryMSI trybu uwierzytelniania do automatycznego uwierzytelniania przy użyciu tożsamości zarządzanej usługi App Service.

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ć Swagger UI 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.