17

LinuxでFreeTDSを使用してpyodbcを使用してSQLServer2005に接続しています。接続のタイムアウト引数が、クエリによって受け入れられていないことに気付きました。

以下を実行すると、両方の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'

代わりに、この出力を取得します。最初のdbクエリが7.5秒以上かかり、2番目の呼び出しがタイムアウトをスローせずに30秒かかっていることを示します。

(808432.0, )
7.56196093559
OK

pyodbcとSQLServerを使用してクエリのタイムアウトを強制するより良い方法はありますか?

4

2 に答える 2

22

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'
于 2012-10-18T12:30:41.180 に答える
15

pyodbc接続を参照してください。2つの別個のタイムアウトパラメーターがあります。Connectionクラスの変数(これはクエリのタイムアウトを設定します)とpyodbc.connectへのキーワードパラメーター(そしてこれは実際の接続プロセス用です)です。これに基づいて、クエリではなくコードで接続プロセスのタイムアウトを設定します。

于 2012-10-18T04:04:16.730 に答える