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()
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)
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
Je me suis retrouvé ici à cause de Django Si c'est votre cas, assurez-vous de faire des migrations