Отменить выполнение запроса в pyscopg2 - PullRequest
4 голосов
/ 11 января 2010

Как можно отменить выполнение оператора запроса, используя pyscopg2 (драйвер Postgres для Python)?

В качестве примера, скажем, у меня есть следующий код:

import psycopg2
cnx_string = "something_appropriate"

conn = psycopg2.connect(cnx_string)
cur = conn.cursor()
cur.execute("long_running_query")

Затем я хочу отменить выполнение этого долго выполняющегося запроса из другого потока - какой метод мне нужно будет вызвать для объектов соединения / курсора, чтобы сделать это?

Ответы [ 3 ]

5 голосов
/ 16 февраля 2010

Вы можете отменить запрос, вызвав функцию pg_cancel_backend(pid) PostgreSQL в отдельном соединении.

Вы можете узнать PID бэкэнда для отмены из connection.get_backend_pid() метода psycopg2 (доступен из версии 2.0.8).

0 голосов
/ 24 августа 2018

У объекта соединения есть член отмены. Используя это и многопоточность вы можете использовать

sqltimeout = threading.Timer(sql_timeout_seconds, conn.cancel)
sqltimeout.start()

Когда таймер истекает, отмена отправляется соединению, и сервер выдает исключение. Не забудьте отменить таймер, когда запрос обычно завершается ....

sqltimeout.cancel()
0 голосов
/ 11 января 2010

Поддержка асинхронного выполнения psycopg2 удалена .

Если вы можете использовать py-postgresql и его транзакции (это py3k), внутренняя реализация асинхронна и поддерживает прерывание.

...