2016-02-26 87 views
7

我正在使用psycopg2 2.6.1。我有一堆需要按順序執行的查詢。psycopg2:光標已關閉

conn = psycopg2.connect(database=redshift_database, 
         user=redshift_user, 
         password=os.environ.get("PGPASSWORD"), 
         host=redshift_cluster, 
         port=redshift_port) 
cursor = conn.cursor() 

queries = [q1, q2, q3....] ## a list of queries 
for query in queries: 
    try: 
     cursor.execute(query) 
    except: 
     print e.message 

假設q1不合格SSL connection has been closed unexpectedly。然後我的其餘查詢也以cursor already closed失敗。我如何確保如果一個查詢失敗,那麼以下查詢將成功執行。

+0

檢查此鏈接可能對您有幫助http://stackoverflow.com/questions/1281875/making-sure-that-psycopg2-database-connection-alive –

回答

9

據推測,如果連接已經降到你需要重新建立,並得到異常處理程序中的另一個光標:

for query in queries: 
    try: 
     cursor.execute(query) 
    except Exception as e: 
     print e.message 
     conn = psycopg2.connect(....) 
     cursor = conn.cursor() 

對於您捕獲的異常,應該更具體一些。假設一個InterfaceError異常,如果光標不知何故關閉你可以趕上像這樣:

except psycopg2.InterfaceError as e: 

可以有其他較溫和的問題,以防止後續的查詢從執行,例如交易被中止。在這種情況下,你需要回滾當前事務,然後嘗試下一個查詢:

queries = ['select count(*) from non_existent_table', 'select count(*) from existing_table'] 
for query in queries: 
    try: 
     cursor.execute(query) 
    except psycopg2.ProgrammingError as exc: 
     print exc.message 
     conn.rollback() 
    except psycopg2.InterfaceError as exc: 
     print exc.message 
     conn = psycopg2.connect(....) 
     cursor = conn.cursor() 

這裏查詢試圖對一個不存在的表。將引發一個ProgrammingError異常,並且如果要嘗試另一個查詢,則必須回滾連接。第二個查詢應該成功。

這掩蓋了例外處理程序本身引發的進一步異常的細節,例如,嘗試重新建立連接時,connect(...)可能會失敗,因此您也應該處理該問題。

+1

連接關閉時正在進行的查詢將會拋出一個'OperationError ',然後後續的將會拋出'InterfaceError's – raphael

1

你應該明確地再生光標在除的情況下,一些集團出了錯在較低的水平,查詢:

for query in queries: 
    try: 
     cursor.execute(query) 
    except: 
     print e.message 
     try: 
      cursor.close() 
      cursor = conn.cursor() 
     except: 
      conn.close() 
      conn = psycopg2.connect(...) 
     cursor = conn.cursor()