Хранимые процедуры SQL не завершаются при вызове из PythonPython

Программы на Python
Ответить
Anonymous
 Хранимые процедуры SQL не завершаются при вызове из Python

Сообщение Anonymous »

Я пытаюсь вызвать хранимую процедуру в моей базе данных MSSQL из сценария Python, но она не запускается полностью при вызове через Python. Эта процедура объединяет данные транзакций в блоки часов/дней в одной таблице, которая позже захватывается сценарием Python. Если я запускаю процедуру в студии SQL, она завершается нормально.

Когда я запускаю ее через свой скрипт, она прерывается примерно на 2/3 пути. В настоящее время я нашел обходной путь, заставив программу спать на 10 секунд, прежде чем перейти к следующему оператору SQL, однако это неэффективно и ненадежно, поскольку некоторые процедуры могут не завершиться за это время. Я ищу более элегантный способ реализовать это.

Текущий код:

Код: Выделить всё

cursor.execute("execute mySP")
time.sleep(10)
cursor.commit()
Статью, наиболее связанную с моей проблемой, которую я могу найти, можно найти здесь:
заставить Python ждать завершения выполнения хранимой процедуры
Я попробовал решение с использованием Tornado и генераторов ввода-вывода, но столкнулся с той же проблемой, которая указана в статье, и которая так и не была решена. Я также попробовал принятое решение для установки поля текущего состояния в базе данных с помощью моих хранимых процедур. В начале моего статуса SP обновляется до 1 в RunningStatus, а когда статус SP завершается, обновляется до 0 в RunningStatus. Затем я реализовал следующий код Python:

Код: Выделить всё

    conn=pyodbc_connect(conn_str)
cursor=conn.cursor()
sconn=pyodbc_connect(conn_str)
scursor=sconn.cursor()

cursor.execute("execute mySP")
cursor.commit()
while 1:
q=scursor.execute("SELECT Status FROM RunningStatus").fetchone()
if(q[0]==0):
break
Когда я реализую это, возникает та же проблема, что и раньше, когда моя хранимая процедура завершает выполнение до того, как она фактически завершается. Если я удалю свой курсор.commit(), как показано ниже, соединение будет зависать на неопределенный срок, пока я не уничтожу процесс Python.

Код: Выделить всё

    conn=pyodbc_connect(conn_str)
cursor=conn.cursor()
sconn=pyodbc_connect(conn_str)
scursor=sconn.cursor()

cursor.execute("execute mySP")
while 1:
q=scursor.execute("SELECT Status FROM RunningStatus").fetchone()
if(q[0]==0):
break
Будем признательны за любую помощь в поиске более эффективного и надежного способа реализации этого, в отличие от time.sleep(10).

Подробнее здесь: https://stackoverflow.com/questions/472 ... rom-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»