在pyscopg2中取消查询执行
如果我想用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 版本及之后可用)。