2015-08-29 61 views
2

我在使用Python中的psycopg2執行長時間查詢時遇到問題。 當查詢時間超過180秒時,腳本執行會長時間掛起。我使用Python 3.4.3psycopg2 2.6.1psycopg2光標在查詢時間過長時掛起

這裏有樣品重現該問題:

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> 

有沒有人知道如何解決這個問題? 謝謝。

回答

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' 
) 
+0

但不應一'QueryCanceledError如果達到了statement_timeout,會引發''InternalError'',因爲它會終止查詢? – tscizzle