web-dev-qa-db-fra.com

Obtention de messages d'erreur à partir des exceptions psycopg2

Ceci est mon premier projet utilisant largement psycopg2. J'essaie de trouver un moyen d'extraire le message d'erreur psql chaque fois qu'une tentative de connexion échoue. J'ai testé le code ci-dessous fonctionnera si toutes les variables sont définies correctement, mais chaque fois qu'une condition d'erreur se produit (par exemple, l'utilisateur choisit une base de données qui n'existe pas), Python me donnera le Suivant:

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'

Existe-t-il une méthode simple et universelle pour intercepter tout message d'erreur généré par psql lorsqu'une connexion échoue, ou dois-je écrire à l'exception des blocs pour plusieurs exceptions psycopg2?

Extrait de mon 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()
16
sirjames2004

Vous interceptez toutes les exceptions avec la classe de base psycopg2.Error. Votre problème est probablement que l'attribut diag est nouveau dans psycopg2 2.5. Quelle est ta version?

>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)
2
Clodoaldo Neto

Lorsque j'essaie de détecter des exceptions, e.pgerror est toujours None pour les erreurs de connexion. Le bloc de code suivant contourne ce problème en imprimant directement "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

Par exemple, en cas d'échec de l'authentification par mot de passe:

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

Je me rends compte que cette question a un an, mais j'espère qu'elle pourrait aider quelqu'un à l'avenir

23
sdemurjian

Je me suis retrouvé ici à cause de Django Si c'est votre cas, assurez-vous de faire des migrations

0
Loaderon