Отменить выполнение запроса в pyscopg2
-
19-09-2019 - |
Вопрос
Как можно было бы отменить выполнение оператора запроса с помощью 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()