1. ホーム
  2. python

[解決済み] pyodbc.connect のタイムアウト引数は、SQL Server への呼び出しでは無視されます。

2022-02-10 15:12:58

質問

LinuxでFreeTDSとpyodbcを使用してSQL Server 2005に接続しています。接続のタイムアウト引数がクエリによって守られないことに気づきました。

以下のように実行すると、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'

その代わりに、このような出力が得られます。最初のデータベースクエリに7.5秒以上、2回目の呼び出しに30秒かかっており、タイムアウトが発生していないことを示しています。

(808432.0, )
7.56196093559
OK

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

どのように解決するのですか?

参照 pyodbc接続 Connectionクラスの変数(これはクエリのタイムアウトを設定します)とpyodbc.connectのキーワードパラメータ(これは実際の接続プロセスのためのものです)の2つの別々のタイムアウトパラメータが存在します。このことから、あなたのコードでは、クエリではなく、接続プロセスのタイムアウトを設定していることになります。