Python 中断键时使用psycopg2终止未完成的SQL提交查询

Python 中断键时使用psycopg2终止未完成的SQL提交查询,python,sql,amazon-redshift,psycopg2,Python,Sql,Amazon Redshift,Psycopg2,我使用一个Python脚本,它使用psycopg2库在AWS红移数据库上运行各种SQL自动提交查询。脚本是从本地工作站手动执行的。流程如下所示: 使用psycopg2.connect()创建数据库连接 使用Execute()在数据库上执行自动提交的查询 密切联系 由于各种原因,数据库可能不可用(网络问题,许多查询已经在运行…),最好停止Python脚本。此时,我通过SQL客户机(SQL工作台)通过检索与这些查询关联的pid来终止已经提交(和未完成)的查询。我想在用户停止Python脚本时(c

我使用一个Python脚本,它使用psycopg2库在AWS红移数据库上运行各种SQL自动提交查询。脚本是从本地工作站手动执行的。流程如下所示:

  • 使用psycopg2.connect()创建数据库连接
  • 使用Execute()在数据库上执行自动提交的查询
  • 密切联系
由于各种原因,数据库可能不可用(网络问题,许多查询已经在运行…),最好停止Python脚本。此时,我通过SQL客户机(SQL工作台)通过检索与这些查询关联的pid来终止已经提交(和未完成)的查询。我想在用户停止Python脚本时(ctrl+c),直接自动执行Python脚本中的最后一步。流程将是:

  • 使用psycopg2.connect()创建数据库连接
  • 使用Execute()在数据库上执行自动提交的查询
  • 使用info.backend\u PID Connection属性存储与查询关联的当前PID
  • 如果收到中断键异常,请使用先前存储的PID终止正在运行的查询
  • 密切联系
我在笔记本上做了一些测试,以检查我是否能够检索到备份信息:

log=logging.getLogger(\uuuuu name\uuuuu)
会话=psycopg2.connect(
连接工厂=记录连接,
主机=主机,
端口=端口,
dbname=数据库,
用户=用户,
密码=密码,
sslmode=“require”,
)
会话初始化(日志)
session.set_session(autocommit=True)
query=”“”
创建或替换函数janky_sleep(x float)返回bool IMMUTABLE作为$$
从时间上导入睡眠
睡眠(x)
返回真值
$$LANGUAGE plpythonu;
"""
cur=session.cursor()
当前执行(查询)
当前执行(“选择janky_sleep(60.0)”)
我使用了一个sleep函数来复制一个需要60秒才能完成的查询的行为。 获取后端pid时,如下所示:

session.info.backend\u pid

问题是execute()方法(运行查询)已经在使用session对象,并且只有在session空闲时(即查询完成时)才会产生后端pid信息

我想到了旋转一个并发Python进程来监视父进程。一旦父进程停止,子进程将通过第二个数据库连接获取后端pid,然后运行kill查询。然而,这种方法似乎有些过分

处理这种情况的正确方法是什么


谢谢

我终于使用了从文档中找到的资源: . 它使Psycopg2能够获取SIGINT信号并终止后续查询

>>> psycopg2.extensions.set_wait_callback(psycopg2.extras.wait_select)
>>> cnn = psycopg2.connect('')
>>> cur = cnn.cursor()
>>> cur.execute("select pg_sleep(10)")
^C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  QueryCanceledError: canceling statement due to user request

>>> cnn.rollback()
>>> # You can use the connection and cursor again from here
>>psycopg2.extensions.set\u wait\u回调(psycopg2.extras.wait\u select)
>>>cnn=psycopg2.connect(“”)
>>>cur=cnn.cursor()
>>>当前执行(“选择pg_睡眠(10)”)
^C
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
QueryCanceledError:由于用户请求而取消语句
>>>cnn.rollback()
>>>#您可以从此处再次使用连接和光标

我最终使用了从文档中找到的资源: . 它使Psycopg2能够获取SIGINT信号并终止后续查询

>>> psycopg2.extensions.set_wait_callback(psycopg2.extras.wait_select)
>>> cnn = psycopg2.connect('')
>>> cur = cnn.cursor()
>>> cur.execute("select pg_sleep(10)")
^C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  QueryCanceledError: canceling statement due to user request

>>> cnn.rollback()
>>> # You can use the connection and cursor again from here
>>psycopg2.extensions.set\u wait\u回调(psycopg2.extras.wait\u select)
>>>cnn=psycopg2.connect(“”)
>>>cur=cnn.cursor()
>>>当前执行(“选择pg_睡眠(10)”)
^C
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
QueryCanceledError:由于用户请求而取消语句
>>>cnn.rollback()
>>>#您可以从此处再次使用连接和光标