对SQL Server的调用忽略pyodbc.connect timeout参数

时间:2012-10-18 00:14:35

标签: python sql-server-2005 pyodbc

我在Linux上使用pyodbc和FreeTDS连接到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'

相反,我得到了这个输出。指示第一个db查询占用7.5秒,第二个调用占用30秒而不会超时。

(808432.0, )
7.56196093559
OK

有没有更好的方法使用pyodbc和SQL Server强制查询超时?

2 个答案:

答案 0 :(得分:11)

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 :(得分:7)

参考pyodbc connection,有两个单独的超时参数,Connection类上的变量(这设置了查询的超时)和pyodbc.connect的关键字参数(以及实际连接过程中的这个参数)。基于此,您将在代码中设置连接过程的超时,而不是查询。