Condividi tramite


Guida introduttiva: Usare Python per connettersi ai dati ed eseguire query nel server flessibile di Database di Azure per PostgreSQL

SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile

In questo argomento di avvio rapido ci si connette a un'istanza del server flessibile di Database di Azure per PostgreSQL tramite Python. È quindi possibile usare istruzioni SQL per eseguire query, inserire, aggiornare ed eliminare dati nel database dalle piattaforme macOS, Ubuntu Linux e Windows.

In questo articolo verranno inclusi due metodi di autenticazione: autenticazione Microsoft Entra e autenticazione PostgreSQL. La scheda Senza password mostra l'autenticazione Microsoft Entra, la scheda Password l'autenticazione PostgreSQL.

L'autenticazione Microsoft Entra è un meccanismo per connettersi a Database di Azure per PostgreSQL tramite identità definite in Microsoft Entra ID. Con l'autenticazione Microsoft Entra è possibile gestire centralmente le identità degli utenti del database e di altri servizi Microsoft semplificando la gestione delle autorizzazioni. Per altre informazioni, vedere Autenticazione Microsoft Entra con Database di Azure per PostgreSQL - Server flessibile.

L'autenticazione PostgreSQL usa gli account archiviati in PostgreSQL. Se si sceglie di usare password come credenziali per gli account, queste credenziali verranno archiviate nella tabella user. Poiché queste password vengono archiviate in PostgreSQL, è necessario gestire manualmente la rotazione delle password.

Questo articolo presuppone che si abbia familiarità con lo sviluppo con Python, ma non con il server flessibile di Database di Azure per PostgreSQL.

Prerequisiti

Aggiungere regole del firewall per la workstation client

Configurare l'integrazione di Microsoft Entra nel server (solo senza password)

Se si seguono i passaggi per l'autenticazione senza password, l'autenticazione di Microsoft Entra deve essere configurata per l'istanza del server e l'utente deve essere un amministratore di Microsoft Entra nell'istanza del server. Seguire la procedura descritta in Configurare l'integrazione di Microsoft Entra per assicurarsi che l'autenticazione di Microsoft Entra sia configurata e che l'utente sia assegnato come amministratore di Microsoft Entra nell'istanza del server.

Preparare l'ambiente di sviluppo

Passare a una cartella in cui si vuole eseguire il codice e creare e attivare un ambiente virtuale. Un ambiente virtuale è una directory autonoma per una versione specifica di Python, più gli altri pacchetti necessari per tale applicazione.

Eseguire i comandi seguenti per creare e attivare un ambiente virtuale:

py -3 -m venv .venv
.venv\Scripts\activate

Installare le librerie Python

Installare le librerie Python necessarie per eseguire gli esempi di codice.

Installare la libreria azure-identity , che fornisce il supporto per l'autenticazione token di Microsoft Entra in Azure SDK.

pip install azure-identity

Aggiungere il codice di autenticazione

In questa sezione si aggiunge il codice di autenticazione alla directory di lavoro ed è necessario eseguire eventuali passaggi aggiuntivi necessari per l'autenticazione e l'autorizzazione con l'istanza del server.

  1. Copiare il codice seguente in un editor e salvarlo in un file denominato 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
    
  2. Recuperare le informazioni di connessione al database SQL.

    1. Nel portale di Azure cercare il nome del server flessibile di Database di Azure per PostgreSQL e selezionarlo.
    2. Nella pagina Panoramica del server copiare il nome completo del server. Il valore completo di Nome server è sempre nel formato <my-server-name>.postgres.database.azure.com.
    3. Nel menu a sinistra, in Sicurezza selezionare Autenticazione. Assicurarsi che l'account sia elencato in Amministratori Microsoft Entra. In caso contrario, completare i passaggi descritti in Configurare l'integrazione di Microsoft Entra nel server (solo senza password).
  3. Impostare le variabili di ambiente per gli elementi dell'URI di connessione:

    set DBHOST=<server-name>
    set DBNAME=<database-name>
    set DBUSER=<username>
    set SSLMODE=require
    

    Sostituire i valori segnaposto seguenti nei comandi:

    • <server-name> con il valore copiato dal portale di Azure.
    • <username> con il nome utente di Azure; per esempio,. john@contoso.com.
    • <database-name> con il nome del database del server flessibile di Database di Azure per PostgreSQL. Un database predefinito denominato postgres è stato creato automaticamente al momento della creazione del server. È possibile usare tale database o crearne uno nuovo usando i comandi SQL.
  4. Accedere ad Azure nella workstation. È possibile accedere usando l'interfaccia della riga di comando di Azure, Azure PowerShell o Azure Developer CLI. Ad esempio, per accedere tramite l'interfaccia della riga di comando di Azure, immettere questo comando:

    az login
    

    Il codice di autenticazione usa DefaultAzureCredential per eseguire l'autenticazione con Microsoft Entra ID e ottenere un token che autorizza l'utente a eseguire operazioni sull'istanza del server. DefaultAzureCredential supporta una catena di tipi di credenziali di autenticazione. Tra le credenziali supportate troviamo le credenziali con cui ci si è connessi agli strumenti di sviluppo, ad esempio l'interfaccia della riga di comando di Azure, Azure PowerShell o Azure Developer CLI.

Come eseguire gli esempi Python

Per ogni esempio di codice in questo articolo, eseguire queste operazioni.

  1. Creare un nuovo file in un editor di testo.

  2. Aggiungere l'esempio di codice al file.

  3. Salvare il file nella cartella del progetto con un'estensione . py, ad esempio postgres-insert.py. Per Windows, verificare che la codifica UTF-8 sia selezionata quando si salva il file.

  4. Nel tipo di cartella del progetto python seguito dal nome file, ad esempio python postgres-insert.py.

Creare una tabella e inserire i dati

L'esempio di codice seguente stabilisce una connessione al database del server flessibile di Database di Azure per PostgreSQL usando la funzione psycopg.connect e carica i dati con un'istruzione INSERT di SQL. La funzione cursor.execute esegue la query SQL sul database.

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()

Quando il codice viene eseguito in modo corretto, genera l'output seguente:

Connection established
Finished dropping table (if existed)
Finished creating table
Inserted 3 rows of data

Leggere i dati

L'esempio di codice seguente stabilisce una connessione al database del server flessibile di Database di Azure per PostgreSQL e usa cursor.execute con l'istruzione SELECT di SQL per leggere i dati. La funzione accetta una query e restituisce un set di risultati su cui eseguire l'iterazione tramite 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()

Quando il codice viene eseguito in modo corretto, genera l'output seguente:

Connection established
Data row = (1, banana, 150)
Data row = (2, orange, 154)
Data row = (3, apple, 100)

Aggiornamento dei dati

L'esempio di codice seguente stabilisce una connessione al database del server flessibile di Database di Azure per PostgreSQL e usa cursor.execute con l'istruzione UPDATE di SQL per aggiornare i dati.

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()

Eliminare dati

L'esempio di codice seguente stabilisce una connessione al database del server flessibile di Database di Azure per PostgreSQL e usa cursor.execute con l'istruzione DELETE di SQL per eliminare una voce di inventario inserita in precedenza.

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()

Passaggi successivi