Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
mssql-python-drivrutinen erbjuder flera hämtningsmetoder, radåtkomstmönster och kursornavigeringsfunktioner för att hämta frågeresultat.
Hämtametoder
Efter att ha kört en SELECT-fråga, använd hämtametoder för att hämta resultat.
fetchone()
Returnerar en enda rad eller None om inga fler rader finns tillgängliga:
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()
Returnerar en lista med rader.
cursor.arraysize styr standardbatchstorleken (standard: 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)
Du kan också specificera storleken direkt:
rows = cursor.fetchmany(50) # Fetch up to 50 rows
Fetchall()
Returnerar alla återstående rader som en 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()
Returnerar den första kolumnen i första raden, vilket är användbart för skalärfrågor.
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}")
Mönster för radåtkomst
Klassen Row stöder flera åtkomstmönster.
Indexåtkomst
Åtkomstkolumner efter position (nollbaserade):
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]
Åtkomst till attribut
Åtkomst till kolumner efter namn:
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
Kolumnnamn med gemener
Aktivera attributnamn med små bokstäver globalt:
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
Iteration
Rader stöder iterering över värden:
cursor.execute("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID < 5")
row = cursor.fetchone()
for value in row:
print(value)
Marköriteration
Iterera direkt över markören för att bearbeta rader:
cursor.execute("SELECT * FROM Production.Product")
for row in cursor:
print(row.Name)
Detta mönster motsvarar att kalla upprepade gånger fetchone() .
Kolumnmetadata
Få tillgång till kolumninformation genom 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}")
Antal rader
Attributet cursor.rowcount indikerar:
- För SELECT: Returnerar -1 efter
execute()tills hämtningen börjar. När du börjar hämta visar det det samlade antalet rader hittills. - För INSERT/UPDATE/DELETE: Antal rader som påverkas.
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}")
Navigering med markören
skip()
Hoppa över rader utan att hämta dem:
cursor.execute("SELECT * FROM Production.Product ORDER BY ProductID")
cursor.skip(10) # Skip first 10 rows
row = cursor.fetchone() # Returns 11th row
scroll()
Flytta markörens position framåt:
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
Drivern stödjer endast mode='relative' med positiva värden. Absolut placering och bakåtskrollning genererar NotSupportedError eftersom drivrutinen använder markörer som bara går framåt.
radnummer
Följ den nuvarande positionen:
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)
Flera resultatuppsättningar
Använd nextset() för att bearbeta flera resultatuppsättningar:
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}")
Stora resultatmängder
För stora resultatmängder, bearbeta rader i batcher för att hantera minnet:
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")
Kontexthanterare
Använd kontexthanterare för automatisk resursrensning:
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
Metodtips
-
Använd
fetchmany()för stora resultat för att undvika att ladda allt i minnet. - Stäng markörerna när du är klar för att frigöra serverresurser.
- Använd kolumnnamn (attributåtkomst ) för mer läsbar kod.
-
Check
rowcountefter dataändringar. -
Hantera
Nonevärden explicit när kolumner är nollbara.