【问题标题】:psycopg2 cursor hangs up when query time is too long查询时间过长时 psycopg2 游标挂起
【发布时间】:2015-08-29 12:41:15
【问题描述】:

我在 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>

有谁知道如何解决这个问题? 谢谢。

【问题讨论】:

    标签: python python-3.x psycopg2


    【解决方案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'
    )
    

    【讨论】:

    • 但是如果达到 statement_timeout 是否应该引发 QueryCanceledErrorInternalError,因为它会终止查询?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多