2012-10-18 21 views
7

पर कॉल के लिए pyodbc.connect टाइमआउट तर्क को अनदेखा किया गया है, मैं SQL सर्वर 2005 से कनेक्ट करने के लिए FreeTDS के साथ लिनक्स पर pyodbc का उपयोग कर रहा हूं। मैंने देखा है कि मेरे कनेक्शन के लिए टाइमआउट तर्क मेरे प्रश्नों से सम्मानित नहीं किया जा रहा है।SQL सर्वर

जब मैं निम्न चलाता हूं तो मैं कर्सर.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' 

इसके बजाय मुझे यह आउटपुट मिलता है। यह इंगित करते हुए कि पहली डीबी क्वेरी 7.5 सेकंड से अधिक समय ले रही है और दूसरी कॉल टाइमआउट फेंकने के बिना 30 सेकंड ले रही है।

(808432.0,) 
7.56196093559 
OK 

क्या पीओडीबीसी और एसक्यूएल सर्वर का उपयोग कर क्वेरी टाइमआउट को मजबूर करने का कोई बेहतर तरीका है?

उत्तर

6

pyodbc connection देखें, दो अलग-अलग टाइमआउट पैरामीटर हैं, कनेक्शन वर्ग पर एक चर (यह क्वेरी के लिए टाइमआउट सेट करता है) और एक कीवर्ड param pyodbc.connect (और यह वास्तविक कनेक्शन प्रक्रिया के लिए) है। इसके आधार पर आप अपने कोड में कनेक्शन प्रक्रिया के लिए टाइमआउट सेट कर रहे हैं, न कि प्रश्नों के लिए।

10

Connection.timeout अपने कोड में परिवर्तनीय असाइनमेंट जोड़ें। 0 (टाइमआउट अक्षम) के लिए डिफ़ॉल्ट, सेकंड में अपेक्षित।

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

मैं precendence द्वारा cravori का जवाब स्वीकार कर लिया है, तब तक आप एक अधिक विस्तृत विवरण के साथ एक ही समाधान दे। उसके लिए धन्यवाद। – ChrisGuest

+0

@ChrisGuest Understood। 'टाइमआउट' वैरिएबल भी मेरे लिए नई जानकारी है, और यह मेरे लिए तत्काल स्पष्ट नहीं था कि इसका लाभ उठाने के लिए क्या किया जाना चाहिए। उम्मीद है कि यह उन लोगों की मदद करेगा जो इसे पार करते हैं और मेरे जैसे घने हैं :-) – Bryan