在psycopg2中设置transaction \query timeout? [英] set transaction\query timeout in psycopg2?

查看:1619
本文介绍了在psycopg2中设置transaction \query timeout?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有办法在数据库事务或数据库查询中为 psycopg2 设置超时?

一个示例用例:

Heroku将django web请求限制为30秒,之后Heroku终止请求而不允许django优雅地回退尚未返回的任何交易。这可能会在postgres上打开未完成的交易。您可以在数据库中配置超时,但这也会限制非Web相关的查询,如维护脚本分析等。在这种情况下,通过中间件设置超时( 您可以将超时设置为连接时间使用选项参数。语法有点奇怪:

 >>> import psycopg2 
>>> cnn = psycopg2.connect(dbname = test options =' - c statement_timeout = 1000')
>>> cur = cnn.cursor()
>>> cur.execute(select pg_sleep(2000))
Traceback(最近一次调用的最后一次):
在< module>中,第1行的文件< stdin>
psycopg2.extensions.QueryCanceledError:由于语句超时取消语句

它也可以被设置使用env变量:

 >>> import os 
>>> os.environ ['PGOPTIONS'] ='-c statement_timeout = 1000'
>>> import psycopg2
>>> cnn = psycopg2.connect(dbname = test)
>>> cur = cnn.cursor()
>>> cur.execute(select pg_sleep(2000))
Traceback(最近一次调用的最后一次):
在< module>中,第1行的文件< stdin>
psycopg2.extensions.QueryCanceledError:由于语句超时取消语句


Is there a way to set a timeout in psycopg2 for db transactions or for db queries?

A sample use-case:
Heroku limits django web requests to 30sec, after which Heroku terminates the request without allowing django to gracefully roll-back any transactions which have not yet returned. This can leave outstanding transactions open on postgres. You could configure a timeout in the database, but that would also limit non-web-related queries such as maintenance scripts analytics etc. In this case setting a timeout via the middleware (or via django) would be preferable.

解决方案

You can set the timeout at connection time using the options parameter. The syntax is a bit weird:

>>> import psycopg2
>>> cnn = psycopg2.connect("dbname=test options='-c statement_timeout=1000'")
>>> cur = cnn.cursor()
>>> cur.execute("select pg_sleep(2000)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout

it can also be set using an env variable:

>>> import os
>>> os.environ['PGOPTIONS'] = '-c statement_timeout=1000'
>>> import psycopg2
>>> cnn = psycopg2.connect("dbname=test")
>>> cur = cnn.cursor()
>>> cur.execute("select pg_sleep(2000)")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout

这篇关于在psycopg2中设置transaction \query timeout?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆