如何使用pyscopg2(python Postgres驱动程序)取消执行查询语句?
举个例子,假设我有以下代码:
import psycopg2
cnx_string = "something_appropriate"
conn = psycopg2.connect(cnx_string)
cur = conn.cursor()
cur.execute("long_running_query")
然后我想取消从另一个线程执行那个长时间运行的查询 - 我必须在连接/游标对象上调用哪个方法来执行此操作?
答案 0 :(得分:5)
您可以通过在单独的连接中调用pg_cancel_backend(pid)
PostgreSQL函数来取消查询。
您可以通过psycopg2的connection.get_backend_pid()
方法(可从2.0.8版获得)知道要取消的后端的PID。
答案 1 :(得分:0)
psycopg2的异步执行支持为removed。
如果你可以使用py-postgresql及其transactions(它是py3k),那么内部实现是异步的,支持被中断。
答案 2 :(得分:0)
连接对象具有取消成员。使用这个和线程,您可以使用
sqltimeout = threading.Timer(sql_timeout_seconds, conn.cancel)
sqltimeout.start()
当计时器到期时,取消将发送到连接,服务器将引发异常。 当查询正常结束时,别忘了取消计时器。...
sqltimeout.cancel()