5

如何使用 pyscopg2(python Postgres 驱动程序)取消执行查询语句?

例如,假设我有以下代码:

import psycopg2
cnx_string = "something_appropriate"

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

然后我想取消从另一个线程执行那个长时间运行的查询 - 我必须在连接/光标对象上调用什么方法才能做到这一点?

4

3 回答 3

7

pg_cancel_backend(pid)您可以通过在单独的连接中调用 PostgreSQL 函数来取消查询。

您可以通过 psycopg2 的方法知道要取消的后端的 PID connection.get_backend_pid()(从 2.0.8 版本开始提供)。

于 2010-02-16T18:03:42.090 回答
1

连接对象有一个取消成员。使用这个和线程你可以使用

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

当计时器到期时,取消被发送到连接并且服务器将引发异常。当查询正常完成时,不要忘记取消计时器......

sqltimeout.cancel()
于 2018-08-24T11:38:29.450 回答
0

psycopg2 的异步执行支持已被删除

如果你可以使用 py-postgresql 及其事务(它是 py3k),内部实现是异步的,并且支持被中断。

于 2010-01-11T16:50:15.403 回答