2014-06-20 10 views
7

Questo è il mio primo progetto che utilizza psycopg2 estesamente. Sto cercando di trovare un modo per estrarre il messaggio di errore psql ogni volta che un tentativo di connessione fallisce. Ho provato il codice qui sotto funziona se tutte le variabili sono impostate correttamente, però ogni volta che si verifica una condizione di errore (ad esempio utente sceglie un database che non esiste), Python mi darà la seguente:Ottenere messaggi di errore dalle eccezioni di 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' 

Esiste un semplice metodo catch-all per catturare qualsiasi messaggio di errore che psql genera quando una connessione fallisce o devo scrivere eccetto i blocchi per più eccezioni psycopg2?

estratto dal mio script:

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() 

risposta

1

si stanno recuperando tutte le eccezioni con la classe di base psycopg2.Error. Probabilmente il tuo problema è che l'attributo diag è nuovo in psycopg2 2.5. Qual è la tua versione?

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

>>> import psycopg2 >>> stampa psycopg2 .__ versione__ 2.0.14 (dt dec ext pq3) Sembra che ci siano alcune versioni dietro. Sfortunatamente, sembra che questa sia la versione più aggiornata in base al repos + epel della mia distribuzione (Scientific Linux). Potrebbe dover seguire il percorso di origine con questo. . . – sirjames2004

+0

Solo curioso, prima di intraprendere una ricerca potenzialmente pericolosa per l'aggiornamento manuale di psycopg2, c'è un modo per ottenere i messaggi di errore di psql connect nelle versioni precedenti di psycopg2, o sono bloccato semplicemente dando loro un messaggio generico quando qualcosa va storto? – sirjames2004

+0

@ sirjames2004 Non lo so. Ma l'installazione con 'setup' o' pip' è abbastanza semplice: http://initd.org/psycopg/install/. Ricordati di 'prima rimuovere psycopg2'. –

14

Quando si tenta di rilevare eccezioni, e.pgerror è sempre None per errori di connessione. Il seguente blocco di codice si aggira direttamente stampando 'e'.

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 

Ad esempio, nel caso di errore di autenticazione della password:

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

Mi rendo conto che questa domanda è un anno di vita ma si spera che possa aiutare qualcuno in futuro

Problemi correlati