Аргумент тайм-аута pyodbc.connect игнорируется для вызовов SQL Server

Я использую pyodbc в Linux с 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'

Вместо этого я получаю этот вывод. Указывает, что первый запрос к базе данных занимает более 7,5 секунд, а второй вызов занимает 30 секунд без тайм-аута.

(808432.0, )
7.56196093559
OK

Есть ли лучший способ заставить тайм-аут запроса использовать pyodbc и SQL Server?


person ChrisGuest    schedule 18.10.2012    source источник


Ответы (2)


См. соединение pyodbc, есть два отдельных параметра тайм-аута, переменная в классе Connection (это устанавливает тайм-аут для запросов) и параметр ключевого слова для pyodbc.connect (и этот для фактического процесса подключения). Исходя из этого, вы устанавливаете тайм-аут для процесса подключения в своем коде, а не для запросов.

person iruvar    schedule 18.10.2012

Добавьте в свой код 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'
person Bryan    schedule 18.10.2012
comment
Хотя я принял ответ Кравори по преимуществу, вы даете то же решение с более подробным объяснением. Спасибо за это. - person ChrisGuest; 19.10.2012
comment
@ChrisGuest Понятно. Переменная timeout для меня также является новой информацией, и я не сразу понял, что нужно сделать, чтобы воспользоваться ею. Надеюсь, это поможет тем, кто сталкивался с этим и был таким же тупым, как я :-) - person Bryan; 19.10.2012
comment
Тайм-аут @Bryan находится на уровне объекта соединения, что означает, что после заполнения объекта соединения можно пройти любой тайм-аут при попытке подключения, я имею в виду тайм-аут входа в систему, поскольку postgres мы можем пройти такой тайм-аут как: psycopg2.connect(user = data[' имя пользователя'], пароль = данные ['пароль'], хост = postgres_host, порт = postgres_port, база данных = postgres_db, connect_timeout = connect_timeout) - person Forhad; 14.04.2020