2012-10-18 14 views
7

Sto utilizzando pyodbc su Linux con FreeTDS per connettersi a SQL Server 2005. Ho notato che l'argomento di timeout della mia connessione non viene rispettato dalle mie query.L'argomento timeout pyodbc.connect viene ignorato per le chiamate a SQL Server

Quando si esegue quanto segue, mi aspetto di vedere gli errori di timeout dopo entrambe le chiamate cursor.execute.

import pyodbc 
import time 

connString = 'SERVER=dbserver;PORT=1433;DATABASE=db;UID=dbuser;PWD=dbpwd;' + \ 
    'DRIVER=FreeTDS' 
cnxn = pyodbc.connect(connString , timeout=3) 

cursor = cnxn.cursor() 

t1 = time.time() 
cursor.execute("SELECT MAX(Qty) FROM big_table WHERE ID<10000005") 
print cursor.fetchone() 
t2 = time.time() 
print t2-t1 

cursor.execute("WAITFOR DELAY '00:00:30'") 
print 'OK' 

Invece ottengo questa uscita. Indica che la prima query db richiede più di 7,5 secondi e la seconda chiamata impiega 30 secondi senza generare un timeout.

(808432.0,) 
7.56196093559 
OK 

Esiste un modo migliore per imporre un timeout di query utilizzando pyodbc e SQL Server?

risposta

6

Vedere pyodbc connection, esistono due parametri di timeout separati, una variabile sulla classe Connection (imposta il timeout per le query) e una parola chiave param su pyodbc.connect (e questa per il processo di connessione effettivo). In base a ciò, si imposta il timeout per il processo di connessione nel codice e non per le query.

10

Aggiungi Connection.timeout assegnazione variabile al codice. Il valore predefinito è 0 (timeout disabilitato), previsto in secondi.

import pyodbc 
import time 

connString = 'SERVER=dbserver;PORT=1433;DATABASE=db;UID=dbuser;PWD=dbpwd;' + \ 
      'DRIVER=FreeTDS' 
cnxn = pyodbc.connect(connString) 
cnxn.timeout = 3 
cursor = cnxn.cursor() 

t1 = time.time() 
cursor.execute("SELECT MAX(Qty) FROM big_table WHERE ID<10000005") 
print cursor.fetchone() 
t2 = time.time() 
print t2-t1 

cursor.execute("WAITFOR DELAY '00:00:30'") 
print 'OK' 
+1

Mentre ho accettato la risposta di cravori in base alla precendenza, fornisci la stessa soluzione con una spiegazione più dettagliata. Grazie per quello. – ChrisGuest

+0

@ChrisGuest capito. Anche la variabile 'timeout' è nuova informazione per me, e non mi è apparso immediatamente chiaro che cosa doveva essere fatto per trarne vantaggio. Speriamo che questo possa aiutare coloro che lo attraversano e sono densi come me :-) – Bryan