在pyscopg2中取消查询执行

8 投票
2 回答
3882 浏览
提问于 2025-04-15 17:53

如果我想用pyscopg2(一个用于Python的Postgres数据库驱动)来取消一个查询语句的执行,我该怎么做呢?

举个例子,假设我有以下这段代码:

import psycopg2
cnx_string = "something_appropriate"

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

然后我想从另一个线程中取消这个运行时间很长的查询,我需要在连接或游标对象上调用哪个方法来实现这个呢?

2 个回答

2

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

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

当计时器到期时,取消指令会发送到连接上,服务器会抛出一个异常。 别忘了在查询正常完成时也要取消计时器....

sqltimeout.cancel()
7

你可以通过在另一个连接中调用 pg_cancel_backend(pid) 这个 PostgreSQL 函数来取消一个查询。

你可以通过 psycopg2 的 connection.get_backend_pid() 方法来获取要取消的后台进程的 PID(这个方法在 2.0.8 版本及之后可用)。

撰写回答