Szybki start: nawiązywanie połączeń z danymi w usłudze Azure Database for PostgreSQL i wykonywanie zapytań względem nich za pomocą języka Python — serwer elastyczny
DOTYCZY: Azure Database for PostgreSQL — serwer elastyczny
W tym przewodniku Szybki start nawiąż połączenie z wystąpieniem serwera elastycznego usługi Azure Database for PostgreSQL przy użyciu języka Python. Następnie użyjesz instrukcji SQL do wykonywania zapytań, wstawiania, aktualizowania i usuwania danych w bazie danych z platform macOS, Ubuntu Linux i Windows.
Kroki opisane w tym artykule obejmują dwie metody uwierzytelniania: uwierzytelnianie firmy Microsoft Entra i uwierzytelnianie PostgreSQL. Karta Bez hasła zawiera uwierzytelnianie firmy Microsoft Entra, a karta Hasło zawiera uwierzytelnianie PostgreSQL.
Uwierzytelnianie entra firmy Microsoft to mechanizm nawiązywania połączenia z usługą Azure Database for PostgreSQL przy użyciu tożsamości zdefiniowanych w identyfikatorze Entra firmy Microsoft. Dzięki uwierzytelnieniu firmy Microsoft Entra można zarządzać tożsamościami użytkowników bazy danych i innymi usługi firmy Microsoft w centralnej lokalizacji, co upraszcza zarządzanie uprawnieniami. Aby dowiedzieć się więcej, zobacz Microsoft Entra authentication with Azure Database for PostgreSQL - Flexible Server (Uwierzytelnianie firmy Microsoft za pomocą usługi Azure Database for PostgreSQL — serwer elastyczny).
Uwierzytelnianie postgreSQL używa kont przechowywanych w usłudze PostgreSQL. Jeśli zdecydujesz się używać haseł jako poświadczeń dla kont, te poświadczenia będą przechowywane w user
tabeli. Ponieważ te hasła są przechowywane w usłudze PostgreSQL, musisz samodzielnie zarządzać rotacją haseł.
W tym artykule założono, że wiesz już, jak programować przy użyciu języka Python, ale dopiero zaczynasz pracę z elastycznym serwerem usługi Azure Database for PostgreSQL.
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Wystąpienie serwera elastycznego usługi Azure Database for PostgreSQL. Aby utworzyć wystąpienie serwera elastycznego usługi Azure Database for PostgreSQL, zobacz Tworzenie wystąpienia usługi Azure Database for PostgreSQL — serwer elastyczny przy użyciu witryny Azure Portal.
- Środowisko Python w wersji 3.8 lub nowszej.
- Najnowszy instalator pakietu .
Dodawanie reguł zapory dla stacji roboczej klienckiej
- Jeśli utworzono wystąpienie serwera elastycznego usługi Azure Database for PostgreSQL z dostępem prywatnym (integracja z siecią wirtualną), musisz nawiązać połączenie z serwerem z zasobu w tej samej sieci wirtualnej co serwer. Możesz utworzyć maszynę wirtualną i dodać ją do sieci wirtualnej utworzonej przy użyciu elastycznego wystąpienia serwera usługi Azure Database for PostgreSQL. Zobacz Tworzenie i zarządzanie usługą Azure Database for PostgreSQL — sieć wirtualna serwera elastycznego przy użyciu interfejsu wiersza polecenia platformy Azure.
- Jeśli utworzono wystąpienie serwera elastycznego usługi Azure Database for PostgreSQL z dostępem publicznym (dozwolonymi adresami IP), możesz dodać lokalny adres IP do listy reguł zapory na serwerze. Zobacz Tworzenie reguł zapory usługi Azure Database for PostgreSQL — serwer elastyczny i zarządzanie nimi przy użyciu interfejsu wiersza polecenia platformy Azure.
Konfigurowanie integracji firmy Microsoft Entra na serwerze (tylko bez hasła)
Jeśli wykonasz kroki uwierzytelniania bez hasła, należy skonfigurować uwierzytelnianie entra firmy Microsoft dla wystąpienia serwera i musisz mieć przypisaną rolę administratora firmy Microsoft Entra w wystąpieniu serwera. Wykonaj kroki opisane w temacie Configure Microsoft Entra integration (Konfigurowanie integracji firmy Microsoft Entra), aby upewnić się, że uwierzytelnianie firmy Microsoft Entra jest skonfigurowane i że masz przypisaną rolę administratora firmy Microsoft Entra w wystąpieniu serwera.
przygotowywanie środowiska programistycznego
Przejdź do folderu, w którym chcesz uruchomić kod, i utwórz i aktywuj środowisko wirtualne. Środowisko wirtualne to samodzielny katalog dla określonej wersji języka Python oraz inne pakiety potrzebne dla tej aplikacji.
Uruchom następujące polecenia, aby utworzyć i aktywować środowisko wirtualne:
py -3 -m venv .venv
.venv\Scripts\activate
Instalowanie bibliotek języka Python
Zainstaluj biblioteki języka Python potrzebne do uruchomienia przykładów kodu.
Zainstaluj bibliotekę azure-identity , która zapewnia obsługę uwierzytelniania tokenów entra firmy Microsoft w zestawie Azure SDK.
pip install azure-identity
Dodawanie kodu uwierzytelniania
W tej sekcji dodasz kod uwierzytelniania do katalogu roboczego i wykonasz dodatkowe kroki wymagane do uwierzytelniania i autoryzacji z wystąpieniem serwera.
Skopiuj następujący kod do edytora i zapisz go w pliku o nazwie get_conn.py.
import urllib.parse import os from azure.identity import DefaultAzureCredential # IMPORTANT! This code is for demonstration purposes only. It's not suitable for use in production. # For example, tokens issued by Microsoft Entra ID have a limited lifetime (24 hours by default). # In production code, you need to implement a token refresh policy. def get_connection_uri(): # Read URI parameters from the environment dbhost = os.environ['DBHOST'] dbname = os.environ['DBNAME'] dbuser = urllib.parse.quote(os.environ['DBUSER']) sslmode = os.environ['SSLMODE'] # Use passwordless authentication via DefaultAzureCredential. # IMPORTANT! This code is for demonstration purposes only. DefaultAzureCredential() is invoked on every call. # In practice, it's better to persist the credential across calls and reuse it so you can take advantage of token # caching and minimize round trips to the identity provider. To learn more, see: # https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/identity/azure-identity/TOKEN_CACHING.md credential = DefaultAzureCredential() # Call get_token() to get a token from Microsft Entra ID and add it as the password in the URI. # Note the requested scope parameter in the call to get_token, "https://ossrdbms-aad.database.windows.net/.default". password = credential.get_token("https://ossrdbms-aad.database.windows.net/.default").token db_uri = f"postgresql://{dbuser}:{password}@{dbhost}/{dbname}?sslmode={sslmode}" return db_uri
Uzyskaj informacje o połączeniu z bazą danych.
- W witrynie Azure Portal wyszukaj i wybierz nazwę serwera elastycznego usługi Azure Database for PostgreSQL.
- Na stronie Przegląd serwera skopiuj w pełni kwalifikowaną nazwę serwera. W pełni kwalifikowana nazwa serwera jest zawsze nazwą< my-server-name.postgres.database.azure.com>.
- W menu po lewej stronie w obszarze Zabezpieczenia wybierz pozycję Uwierzytelnianie. Upewnij się, że Twoje konto znajduje się na liście w obszarze Administratorzy firmy Microsoft. Jeśli tak nie jest, wykonaj kroki opisane w temacie Konfigurowanie integracji firmy Microsoft Entra na serwerze (tylko bez hasła).
Ustaw zmienne środowiskowe dla elementów identyfikatora URI połączenia:
set DBHOST=<server-name> set DBNAME=<database-name> set DBUSER=<username> set SSLMODE=require
Zastąp następujące wartości zastępcze w poleceniach:
<server-name>
z wartością skopiowaną z witryny Azure Portal.<username>
przy użyciu nazwy użytkownika platformy Azure; na przykład.john@contoso.com
.<database-name>
z nazwą elastycznej bazy danych serwera usługi Azure Database for PostgreSQL. Domyślna baza danych o nazwie postgres została automatycznie utworzona podczas tworzenia serwera. Możesz użyć tej bazy danych lub utworzyć nową bazę danych przy użyciu poleceń SQL.
Zaloguj się na platformie Azure na stacji roboczej. Możesz zalogować się przy użyciu interfejsu wiersza polecenia platformy Azure, programu Azure PowerShell lub interfejsu wiersza polecenia dla deweloperów platformy Azure. Aby na przykład zalogować się za pośrednictwem interfejsu wiersza polecenia platformy Azure, wprowadź następujące polecenie:
az login
Kod uwierzytelniania używa
DefaultAzureCredential
metody do uwierzytelniania za pomocą identyfikatora Entra firmy Microsoft i uzyskania tokenu, który autoryzuje Cię do wykonywania operacji na wystąpieniu serwera.DefaultAzureCredential
obsługuje łańcuch typów poświadczeń uwierzytelniania. Wśród obsługiwanych poświadczeń są poświadczenia, które logujesz się do narzędzi deweloperskich, takich jak interfejs wiersza polecenia platformy Azure, program Azure PowerShell lub interfejs wiersza polecenia dla deweloperów platformy Azure.
Jak uruchomić przykłady języka Python
Dla każdego przykładu kodu w tym artykule:
Utwórz nowy plik w edytorze tekstów.
Dodaj przykładowy kod do pliku.
Zapisz plik w folderze projektu przy użyciu rozszerzenia .py , takiego jak postgres-insert.py. W przypadku systemu Windows upewnij się, że podczas zapisywania pliku wybrano kodowanie UTF-8.
W folderze projektu wpisz
python
nazwę pliku, na przykładpython postgres-insert.py
.
Tworzenie tabeli i wstawianie danych
Poniższy przykład kodu łączy się z elastyczną bazą danych serwera usługi Azure Database for PostgreSQL przy użyciu funkcji i ładuje dane za pomocą psycopg.connect
instrukcji SQL INSERT . Funkcja cursor.execute
wykonuje zapytanie SQL względem bazy danych.
import psycopg
from get_conn import get_connection_uri
conn_string = get_connection_uri()
conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()
# Drop previous table of same name if one exists
cursor.execute("DROP TABLE IF EXISTS inventory;")
print("Finished dropping table (if existed)")
# Create a table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
print("Finished creating table")
# Insert some data into the table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("orange", 154))
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("apple", 100))
print("Inserted 3 rows of data")
# Clean up
conn.commit()
cursor.close()
conn.close()
Po pomyślnym uruchomieniu kodu generuje następujące dane wyjściowe:
Connection established
Finished dropping table (if existed)
Finished creating table
Inserted 3 rows of data
Odczyt danych
Poniższy przykład kodu łączy się z elastyczną bazą danych serwera usługi Azure Database for PostgreSQL i używa instrukcji cursor.execute z instrukcją SQL SELECT w celu odczytu danych. Ta funkcja akceptuje zapytanie i zwraca zestaw wyników w celu iteracji przy użyciu funkcji cursor.fetchall().
import psycopg
from get_conn import get_connection_uri
conn_string = get_connection_uri()
conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()
# Fetch all rows from table
cursor.execute("SELECT * FROM inventory;")
rows = cursor.fetchall()
# Print all rows
for row in rows:
print("Data row = (%s, %s, %s)" %(str(row[0]), str(row[1]), str(row[2])))
# Cleanup
conn.commit()
cursor.close()
conn.close()
Po pomyślnym uruchomieniu kodu generuje następujące dane wyjściowe:
Connection established
Data row = (1, banana, 150)
Data row = (2, orange, 154)
Data row = (3, apple, 100)
Aktualizowanie danych
Poniższy przykład kodu łączy się z elastyczną bazą danych serwera usługi Azure Database for PostgreSQL i używa polecenia cursor.execute z instrukcją SQL UPDATE w celu zaktualizowania danych.
import psycopg
from get_conn import get_connection_uri
conn_string = get_connection_uri()
conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()
# Update a data row in the table
cursor.execute("UPDATE inventory SET quantity = %s WHERE name = %s;", (200, "banana"))
print("Updated 1 row of data")
# Cleanup
conn.commit()
cursor.close()
conn.close()
Usuwanie danych
Poniższy przykład kodu łączy się z elastyczną bazą danych serwera usługi Azure Database for PostgreSQL i używa polecenia cursor.execute z instrukcją SQL DELETE , aby usunąć wcześniej wstawiony element spisu.
import psycopg
from get_conn import get_connection_uri
conn_string = get_connection_uri()
conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()
# Delete data row from table
cursor.execute("DELETE FROM inventory WHERE name = %s;", ("orange",))
print("Deleted 1 row of data")
# Cleanup
conn.commit()
cursor.close()
conn.close()