Вопрос

Как можно было бы отменить выполнение оператора запроса с помощью pyscopg2 (драйвер python Postgres)?

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

import psycopg2
cnx_string = "something_appropriate"

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Объект connection имеет элемент cancel (отмена).Используя это и потоковую обработку, вы могли бы использовать

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

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

sqltimeout.cancel()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top