Отменить / прервать query.execute () для cx_oracle - PullRequest
0 голосов
/ 25 апреля 2018

Я только что создал скрипт с длинным запросом и добавил обработанный сигнал: когда я нажимаю CTRL + C , он запускает connection.close().

Но когда я запускаю скрипт py и нажимаю CTRL + C , он просто ждет окончания выполнения для обработки сигнала.

Есть ли способ отменить его во время работы?

def signal_term_handler(signal, frame):
    connection.cancel()
    sys.exit('Excution stopped manually.')

ip = IP
port = PORT
SID = SID
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
connection = cx_Oracle.connect(USER, PASS, dsn_tns)
cursor = connection.cursor()


signal.signal(signal.SIGTERM, signal_term_handler)
signal.signal(signal.SIGINT, signal_term_handler)
cursor.execute(QUERY)

QUERY - это запрос с множественным выбором, который длится около 4 минут.

1 Ответ

0 голосов
/ 24 августа 2018
cursor = connection.cursor()

try:
  cursor.execute(QUERY)
except KeyboardInterrupt:
  sys.exit('Excution stopped manually.')

Это должно быть близко к тому, что вы хотите. Похоже, что cx_Oracle повторно вызывает KeyBoardInterrupt, поэтому для выполнения полного перехвата вам нужно вложить обработчик в дополнительную внешнюю попытку: кроме KeyboardInterrupt:

...