我在Python中使用psycopg2执行长时间查询时遇到问题。 当查询花费超过180秒时,脚本执行会挂起很长时间。
我使用Python 3.4.3
和psycopg2 2.6.1
。
以下是重现此问题的示例:
import psycopg2
cnn = psycopg2.connect(
database='**********',
user='**********',
password='**********',
host='**********',
port=5432,
)
print("Connected")
cursor = cnn.cursor()
seconds = 5
print("Sleep %s seconds"%seconds)
cursor.execute("SELECT pg_sleep(%s);"%seconds)
print("Exit.")
当查询需要5秒时脚本正常工作:
$python3 /tmp/test.py
Connected
Sleep 5 seconds
Exit.
但是当秒数大约为180或更大时,行cursor.execute
将挂起,并且以下说明永远不会执行:
import psycopg2
cnn = psycopg2.connect(
database='**********',
user='**********',
password='**********',
host='**********',
port=5432,
)
print("Connected")
cursor = cnn.cursor()
seconds = 180
print("Sleep %s seconds"%seconds)
cursor.execute("SELECT pg_sleep(%s);"%seconds)
print("Exit.")
这是一个输出:
$python3 /tmp/test.py
Connected
Sleep 5 seconds
<Never exit>
有谁知道如何解决这个问题? 谢谢。
答案 0 :(得分:1)
您可能在某处设置了语句超时。尝试将其关闭以用于单个语句:
cursor = cnn.cursor()
seconds = 180
# Turn statement_timeout off for the next query
cursor.execute("SET statement_timeout = 0")
print("Sleep %s seconds"%seconds)
cursor.execute("SELECT pg_sleep(%s);"%seconds)
print("Exit.")
如果此方法有效,请更改默认值,无论您定义它还是仅用于连接:
cnn = psycopg2.connect(
database='**********',
user='**********',
password='**********',
host='**********',
port=5432,
options='-c statement_timeout=0'
)