Passaggio 3: Modello di verifica per la connessione a SQL tramite pyodbc
Questo modello di verifica di esempio usa pyodbc
per connettersi a un database SQL. In questo esempio si presuppone l’uso del database di esempio AdventureWorksLT.
Nota
Questo esempio deve essere considerato solo un modello di verifica. Il codice di esempio è semplificato per maggiore chiarezza e non rappresenta necessariamente le procedure consigliate da Microsoft.
Prerequisiti
- Python 3
- Se ancora non si dispone di Python, installare Runtime Python e Gestione pacchetti di Python Package Index (PyPI) da python.org.
- È preferibile non usare il proprio ambiente? Aprire come devcontainer usando GitHub Codespaces.
pyodbc
pacchetto da PyPI.- Installare il driver ODBC 18 di Microsoft per SQL Server
- Un database SQL e le credenziali.
Connettersi ed eseguire query sui dati
Connettere a un database usando le proprie credenziali.
Creare un file denominato app.py.
Aggiungere una docstring del modulo.
""" Connects to a SQL database using pyodbc """
Importare il pacchetto
pyodbc
.import pyodbc
Creare variabili per le credenziali di connessione.
SERVER = '<server-address>' DATABASE = '<database-name>' USERNAME = '<username>' PASSWORD = '<password>'
Creare una variabile stringa di connessione usando l'interpolazione di stringhe.
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
Usare la
pyodbc.connect
funzione per connettersi a un database SQL.conn = pyodbc.connect(connectionString)
Eseguire una query
Usare una stringa di query SQL per eseguire una query e analizzare i risultati.
Creare una variabile per la stringa di query SQL.
SQL_QUERY = """ SELECT TOP 5 c.CustomerID, c.CompanyName, COUNT(soh.SalesOrderID) AS OrderCount FROM SalesLT.Customer AS c LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.CompanyName ORDER BY OrderCount DESC; """
Utilizzare
cursor.execute
per riprendere un set di risultati da una query sul database.cursor = conn.cursor() cursor.execute(SQL_QUERY)
Nota
Questa funzione accetta essenzialmente qualsiasi query e restituisce un set di risultati su cui è possibile eseguire l'iterazione usando cursor.fetchone().
Usare
cursor.fetchall
con un cicloforeach
per ottenere tutti i record dal database. Stampare i record.records = cursor.fetchall() for r in records: print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
Salva il file app.py.
Aprire un terminale e testare l'applicazione.
python app.py
29485 1 Professional Sales and Service 29531 1 Remarkable Bike Store 29546 1 Bulk Discount Store 29568 1 Coalition Bike Company 29584 1 Futuristic Bikes
Inserire una riga come transazione
Questo esempio spiega come eseguire in modo sicuro un'istruzione INSERT
e passare i parametri. Il passaggio di parametri come valori protegge l'applicazione dagli attacchi SQL injection.
Importa
randrange
dalla libreriarandom
.from random import randrange
Generare un numero di prodotto casuale.
productNumber = randrange(1000)
Suggerimento
La generazione di un numero di prodotto casuale garantisce la possibilità di eseguire questo esempio più volte.
Creare una stringa di istruzione SQL.
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
Eseguire l'istruzione con
cursor.execute
.cursor.execute( SQL_STATEMENT, f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 )
Recuperare la prima colonna del singolo risultato usando
cursor.fetchval
, stampare l'identificatore univoco del risultato e quindi eseguire il commit dell'operazione come transazione usandoconnection.commit
.resultId = cursor.fetchval() print(f"Inserted Product ID : {resultId}") conn.commit()
Suggerimento
In alternativa, è possibile usare
connection.rollback
per eseguire il ripristino dello stato precedente della transazione.Chiudere il cursore e la connessione usando
cursor.close
econnection.close
.cursor.close() conn.close()
Salvare il file app.py e testare nuovamente l'applicazione
python app.py
Inserted Product ID : 1001