python-3.x psycopg2游标在查询时间过长时挂起

k7fdbhmy  于 2023-05-30  发布在  Python
关注(0)|答案(2)|浏览(157)

bounty还有13小时到期。此问题的答案有资格获得+50声望奖励。the21st正在寻找此问题的最新答案。

我在Python中使用psycopg2执行长时间查询时遇到了问题。当查询时间超过180秒时,脚本执行将挂起很长时间。
我使用Python 3.4.3psycopg2 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>

有人知道如何解决这个问题吗?谢谢你。

ctzwtxfj

ctzwtxfj1#

您可能在某处设置了语句超时。尝试为单个语句关闭它:

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'
)
c0vxltue

c0vxltue2#

简单地说,您必须设置超时选项,因为您需要在一段时间后退出函数。

conn = psycopg2.connect(db_url, options='-c statement_timeout=300000')  # timout in ms

这对我很有效

相关问题