Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il driver mssql-python offre diversi metodi di recupero, schemi di accesso alle righe e funzionalità di navigazione del cursore per recuperare i risultati delle query.
Metodi di recupero
Dopo aver eseguito una query SELECT, usa metodi fetch per recuperare i risultati.
Fetchone()
Restituisce una singola riga o None , se non ne sono disponibili altre righe:
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product")
row = cursor.fetchone()
while row:
print(f"{row.ProductID}: {row.Name} - ${row.ListPrice}")
row = cursor.fetchone()
Fetchmany()
Restituisce una lista di righe.
cursor.arraysize Controlla la dimensione predefinita del lotto (predefinita: 1):
cursor.execute("SELECT * FROM Production.Product")
cursor.arraysize = 100 # Fetch 100 rows at a time
while True:
rows = cursor.fetchmany()
if not rows:
break
for row in rows:
print(row.Name)
Puoi anche specificare direttamente la dimensione:
rows = cursor.fetchmany(50) # Fetch up to 50 rows
fetchall()
Restituisce tutte le righe rimanenti come una lista:
cursor.execute("SELECT * FROM Production.Product WHERE Color = 'Black'")
rows = cursor.fetchall()
print(f"Found {len(rows)} products")
for row in rows:
print(row.Name)
Fetchval()
Restituisce la prima colonna della prima riga, utile per le query scalari.
count = cursor.execute("SELECT COUNT(*) FROM Production.Product").fetchval()
print(f"Total products: {count}")
max_price = cursor.execute("SELECT MAX(ListPrice) FROM Production.Product").fetchval()
print(f"Highest price: ${max_price}")
Modelli di accesso alle righe
La Row classe supporta molteplici schemi di accesso.
Accesso all'indice
Accedi alle colonne per posizione (basata su zero):
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID < 5")
row = cursor.fetchone()
product_id = row[0]
name = row[1]
price = row[2]
Accesso agli attributi
Accedi alle colonne per nome:
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID < 5")
row = cursor.fetchone()
product_id = row.ProductID
name = row.Name
price = row.ListPrice
Nomi delle colonne in minuscolo
Abilita i nomi degli attributi minuscoli a livello globale:
import mssql_python
settings = mssql_python.get_settings()
settings.lowercase = True
cursor.execute("SELECT ProductID, Name FROM Production.Product WHERE ProductID < 5")
row = cursor.fetchone()
print(row.productid, row.name) # Lowercase access
settings.lowercase = False # Restore default
Iterazione
Le righe supportano l'iterazione sui valori:
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID < 5")
row = cursor.fetchone()
for value in row:
print(value)
Iterazione del cursore
Scorri direttamente il cursore per elaborare le righe:
cursor.execute("SELECT * FROM Production.Product")
for row in cursor:
print(row.Name)
Questo schema equivale a chiamare fetchone() ripetutamente.
Metadati delle colonne
Accedi alle informazioni sulle colonne attraverso cursor.description:
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID < 5")
for col in cursor.description:
name, type_code, display_size, internal_size, precision, scale, null_ok = col
print(f"Column: {name}, Type: {type_code}, Nullable: {null_ok}")
Numero di righe
L'attributo cursor.rowcount indica:
- Per SELECT: restituisce -1 dopo
execute()finché non inizia il recupero. Una volta avviato il recupero, indica il numero cumulativo di righe recuperate fino a quel momento. - Per INSERT/UPDATE/DELETE: Numero di righe interessate.
cursor.execute("SELECT * FROM Production.Product")
print(f"Rows returned: {cursor.rowcount}")
cursor.execute("CREATE TABLE #PriceUpd (Name NVARCHAR(50), Price DECIMAL(10,2), CategoryID INT)")
cursor.execute("INSERT INTO #PriceUpd VALUES ('A',10,1),('B',20,1),('C',30,2)")
cursor.execute("UPDATE #PriceUpd SET Price = Price * 1.1 WHERE CategoryID = 1")
print(f"Rows updated: {cursor.rowcount}")
Navigazione con cursore
skip()
Salta le file senza doverle prendere:
cursor.execute("SELECT * FROM Production.Product ORDER BY ProductID")
cursor.skip(10) # Skip first 10 rows
row = cursor.fetchone() # Returns 11th row
scroll()
Sposta la posizione del cursore in avanti:
cursor.execute("SELECT * FROM Production.Product ORDER BY ProductID")
# Move forward 5 rows from current position
cursor.scroll(5, mode='relative')
row = cursor.fetchone()
Note
Il driver supporta solo mode='relative' con valori positivi. Il posizionamento assoluto e lo scorrimento all'indietro generano NotSupportedError perché il driver usa cursori solo in avanti.
Numero di riga
Traccia la posizione attuale:
cursor.execute("SELECT * FROM Production.Product")
print(f"Initial position: {cursor.rownumber}") # -1 (before first fetch)
row = cursor.fetchone()
print(f"After fetchone: {cursor.rownumber}") # 0 (first row fetched)
Più set di risultati
Utilizzare nextset() per elaborare più set di risultati:
cursor.execute("""
SELECT * FROM Production.Product WHERE Color = 'Black';
SELECT * FROM Production.ProductCategory;
SELECT COUNT(*) FROM Production.Product;
""")
# First result set
products = cursor.fetchall()
print(f"Products: {len(products)}")
# Move to second result set
if cursor.nextset():
categories = cursor.fetchall()
print(f"Categories: {len(categories)}")
# Move to third result set
if cursor.nextset():
count = cursor.fetchval()
print(f"Total count: {count}")
Grandi insiemi di risultati
Per grandi set di risultati, elaborare le righe in batch per gestire la memoria:
def process_batch(rows):
# Example: print each row. Replace with your own logic.
for row in rows:
print(row)
cursor.execute("SELECT * FROM LargeTable")
cursor.arraysize = 1000
while True:
rows = cursor.fetchmany()
if not rows:
break
process_batch(rows)
print(f"Processed {cursor.rownumber} rows so far")
Gestori di contesto
Usa i gestori di contesto per la pulizia automatica delle risorse:
with mssql_python.connect(connection_string) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM Production.Product")
for row in cursor:
print(row.Name)
# Cursor and connection closed automatically
Procedure consigliate
-
Usalo
fetchmany()per risultati grandi per evitare di caricare tutto in memoria. - Chiudi i cursori quando è finito per liberare le risorse del server.
- Usa i nomi delle colonne (accesso agli attributi) per un codice più leggibile.
-
Controlla
rowcountdopo le istruzioni di modifica dei dati. -
Gestire esplicitamente i valori
Nonequando le colonne sono nullabili.