Avvio rapido: Usare Python per connettersi ed eseguire query sui dati nel server flessibile Database di Azure per PostgreSQL

In questa guida rapida ci si connette a un server flessibile di Database di Azure per PostgreSQL usando 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 di Microsoft Entra con Database di Azure per PostgreSQL.

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

Questo articolo presuppone che tu abbia familiarità con lo sviluppo usando Python, ma che tu sia nuovo all'uso di Azure Database per PostgreSQL.

Prerequisiti

Aggiungere regole del firewall per la workstation client

  • Se è stato creato il server flessibile Database di Azure per PostgreSQL con accesso privato (integrazione rete virtuale), è necessario connettersi al server da una risorsa all'interno della stessa rete virtuale del server. È possibile creare una macchina virtuale e aggiungerla alla rete virtuale creata con il server flessibile Database di Azure per PostgreSQL. Fare riferimento a Networking.
  • Se è stato creato il server flessibile Database di Azure per PostgreSQL con accesso pubblico (indirizzi IP consentiti), è possibile aggiungere l'indirizzo IP locale all'elenco delle regole del firewall nel server. Fare riferimento a Networking.

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

Se si stanno seguendo i passaggi per l'autenticazione senza password, l'autenticazione Microsoft Entra deve essere configurata per il server ed è necessario che sia assegnato il ruolo di amministratore Microsoft Entra sul server. Seguire la procedura descritta in Configurare l'integrazione Microsoft Entra per assicurarsi che Microsoft Entra l'autenticazione sia configurata e che l'utente sia assegnato come amministratore di Microsoft Entra nel server.

Preparare l'ambiente di sviluppo

Passare a una cartella in cui si vuole eseguire il codice. 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 tramite token di Microsoft Entra in Azure SDK.

# Use the interpreter-bound pip to ensure installs go into the active venv/interpreter
python -m pip install --upgrade pip
python -m pip install azure-identity azure-keyvault-secrets

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 il server.

Prima di aggiungere il codice di autenticazione, assicurarsi che i pacchetti necessari per ogni esempio siano installati.

Pacchetti obbligatori (esempi in questo articolo):

  • Esempio senza password: azure-identity, azure-keyvault-secrets (se si usa Key Vault)
  • Esempio di password: psycopg (scelta consigliata: python -m pip install "psycopg[binary]")

Facoltativo: creare un requirements.txt con queste voci e installarlo con python -m pip install -r requirements.txt per le installazioni riproducibili.

  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
    
  4. Accedere ad Azure nella workstation. È possibile accedere usando l'interfaccia della riga di comando di Azure, Azure PowerShell o Azure Developer CLI.

    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 sul server. DefaultAzureCredential supporta una catena di tipi di credenziali di autenticazione. Tra le credenziali supportate vi sono quelle usate per accedere agli strumenti per sviluppatori, ad esempio 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. Nella cartella del progetto digitare python seguito dal nome del file, ad esempio python postgres-insert.py.

Creare una tabella e inserire i dati

L'esempio di codice seguente si connette al database del server flessibile di Database di Azure per PostgreSQL usando la funzione psycopg.connect e carica i dati con un'istruzione SQL INSERT. 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 dati

L'esempio di codice seguente si connette al database del server flessibile di Database di Azure per PostgreSQL e usa cursor.execute con l'istruzione SQL SELECT 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 si connette al database del server flessibile di Database di Azure per PostgreSQL e usa cursor.execute con l'istruzione SQL UPDATE 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()

Cancellare dati

L'esempio di codice seguente si connette al database del server flessibile di Database di Azure per PostgreSQL e usa cursor.execute con l'istruzione SQL DELETE per eliminare un elemento di inventario inserito 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()