17

我在带有 FreeTDS 的 Linux 上使用 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'

相反,我得到了这个输出。表明第一个 db 查询占用了 7.5 秒,第二个调用占用了 30 秒而没有引发超时。

(808432.0, )
7.56196093559
OK

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

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 connection,有两个单独的超时参数,一个是 Connection 类的变量(设置查询的超时时间),一个是 pyodbc.connect 的关键字参数(这个用于实际的连接过程)。基于此,您在代码中为连接过程设置超时,而不是为查询设置超时。

于 2012-10-18T04:04:16.730 回答