2014-06-20 11 views
7

यह psycopg2 का व्यापक रूप से उपयोग करने वाला मेरा पहला प्रोजेक्ट है। जब भी कोई कनेक्शन प्रयास विफल रहता है, तो मैं psql त्रुटि संदेश निकालने का तरीका खोजने का प्रयास कर रहा हूं। मैं परीक्षण किया है कोड के नीचे सभी चर ठीक से सेट कर रहे हैं, जब भी एक त्रुटि स्थिति उत्पन्न होती है काम करेंगे हालांकि, (जैसे उपयोगकर्ता एक डेटाबेस है जो मौजूद नहीं चुनते हैं), अजगर मुझे दे देंगे निम्नलिखित:psycopg2 अपवादों से त्रुटि संदेश प्राप्त करना

I am unable to connect to the database 
None 
Traceback (most recent call last): 
    File "./duplicate_finder.py", line 163, in <module> 
    main(sys.argv[1:]) 
    File "./duplicate_finder.py", line 142, in main 
    print e.diag.message_detail 
AttributeError: 'OperationalError' object has no attribute 'diag' 

क्या कनेक्शन विफल होने पर psql उत्पन्न होने वाले त्रुटि संदेश को पकड़ने के लिए एक सरल, कैच-ऑल विधि है, या मुझे एकाधिक psycopg2 अपवादों के लिए ब्लॉक को छोड़कर लिखने की आवश्यकता है? मेरी स्क्रिप्ट से

निकालें:

import sys, getopt, os, time, csv, psycopg2 

    ... 
    ... 

    conn_string = "host=" + dbhost + " dbname=" + database + " user=" + dbuser + " password=" + dbpass 
    try: 
     conn = psycopg2.connect(conn_string) 
    except psycopg2.Error as e: 
     print "Unable to connect!" 
     print e.pgerror 
     print e.diag.message_detail 
     sys.exit(1) 
    else: 
     print "Connected!" 
     cur = conn.cursor() 
     cur.execute("SELECT id, lastname, firstname, location FROM test ORDER BY ctl_upd_dttm DESC;") 
     print cur.fetchone() 
     ... 
     conn.close() 

उत्तर

1

आप आधार वर्ग psycopg2.Error साथ सभी अपवादों को पकड़ने रहे हैं। आपकी समस्या शायद diag विशेषता psycopg2 2.5 में नई है। आपका संस्करण क्या है?

>>> print psycopg2.__version__ 
2.5.1 (dt dec pq3 ext) 
+0

>>> आयात psycopg2 में कोई मदद कर सकता है >>> प्रिंट psycopg2 .__ संस्करण__ 2.0.14 (डीटी डीसी एक्सटी पीक्यू 3) ऐसा लगता है कि मैं पीछे कुछ संस्करण हूं। दुर्भाग्य से, ऐसा लगता है कि यह मेरे डिस्ट्रो (वैज्ञानिक लिनक्स) repos + epel के अनुसार सबसे अद्यतित संस्करण है। इसके साथ स्रोत मार्ग जाना पड़ सकता है। । । – sirjames2004

+0

बस उत्सुकता से पहले, मैं psycopg2 को मैन्युअल रूप से अपग्रेड करने की संभावित खतरनाक खोज शुरू करने से पहले, psycopg2 के पुराने संस्करणों में psql कनेक्ट त्रुटि संदेश प्राप्त करने का कोई तरीका है, या क्या मैं कुछ गलत होने पर उन्हें एक सामान्य संदेश देने के साथ अटक गया हूं? – sirjames2004

+0

@ sirjames2004 मुझे नहीं पता। लेकिन 'सेटअप' या' पीआईपी 'के साथ स्थापित करना काफी आसान है: http://initd.org/psycopg/install/। बस 'yum psycopg2' को पहले याद रखें। –

14

जब मैं अपवादों को पकड़ने की कोशिश करता हूं, तो e.pgerror कनेक्शन त्रुटियों के लिए हमेशा कोई नहीं होता है। निम्नलिखित कोड ब्लॉक को 'ई' प्रिंट करके सीधे इसके आसपास मिलता है।

try: 
    conn = psycopg2.connect(conn_string) 
except psycopg2.OperationalError as e: 
    print('Unable to connect!\n{0}').format(e) 
    sys.exit(1) 
else: 
    print('Connected!') 
    # do stuff 

उदाहरण के लिए, पासवर्ड प्रमाणीकरण विफलता के मामले में:

Unable to connect! 
FATAL: password authentication failed for user "user" 

मैं इस सवाल का एहसास एक साल का है, लेकिन उम्मीद है कि भविष्य

संबंधित मुद्दे