2016-02-26 24 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 

मान लीजिए q1SSL 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

कनेक्शन बंद होने पर प्रगति प्रगति पर होगी 'ऑपरेशन एरर ', और उसके बाद वाले लोग 'इंटरफेस एरर' फेंक देंगे – 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() 
संबंधित मुद्दे