我的代码:
import pyodbc
connection = pyodbc.connect("DRIVER={SQL Server};SERVER=MYSERVER;DATABASE=mydatabase;Trusted_Connection=yes")
connection.timeout = 3
cursor = connection.cursor()
results = cursor.execute("SELECT * FROM someLongTable").fetchall()
超时参数将被忽略,查询的运行时间与完成所需的时间(几分钟)一样长。
这与这家伙遇到的问题相同,但对他有效的解决方案对我不起作用。现在,与他不同,我在Windows上(客户端和服务器都是Windows机器)。我知道信号在Windows上效果不佳,有时人们使用信号来编写超时函数,所以也许Windows是这里的问题?难道是这样?如果是这样,是否有任何解决方法?
(Python 2.7.9, pyodbc 3.0.7, Windows Server 2012, MSSQL 2012)
我找到了一个解决方法:逐个检索结果,计算总运行时间,如果超过 ~30 秒,则放弃。
import time
import pyodbc
def getMSSQLdata(cursor):
connection = pyodbc.connect("DRIVER={SQL Server};SERVER=MYSERVER;DATABASE=mydatabase;Trusted_Connection=yes")
cursor = connection.cursor()
results = []
t0 = time.time()
while True:
if (time.time() - t0) < 30:
next = cursor.fetchone()
if next:
results.append(next)
else:
print "query executed in {} seconds".format(time.time() - t0)
return results
else:
print "aborted - query took longer than 30 seconds"
return None # or raise some exception
当然,您可以修改它以在超过一定数量的行(而不是特定时间)后中止。或者只返回前 ~30 秒内检索到的任何行。等等。
(虽然它并不漂亮 - 而且并不精确。我希望我能弄清楚为什么pyodbc的超时参数在Windows中被忽略。
这是一个老问题,但我只是遇到了同样的问题,但在pypyodbc中,并且已经解决了为什么它不起作用。
基本上查询超时有效,但不适用于 .fetchall()
t = time()
sqlStatement = " SELECT TOP (20000) * FROM BigTable"
DSN="Driver={SQL Server};Server=Server;Database=Database;Trusted_Connection=yes"
cnxn = pypyodbc.connect(DSN)
cnxn.timeout = 1
cursor = cnxn.cursor()
print (time()- t)
cursor.execute(sqlStatement)
print (time()- t)
results = cursor.fetchall()
print (time()- t)
给出以下结果:
0.09884047508239746
0.2534453868865967
3.447007894515991