从psycopg2异常中获取错误信息
这是我第一次在项目中大量使用psycopg2。我想找一种方法来提取psql的错误信息,以便在连接尝试失败时能够看到具体的错误。我测试了下面的代码,如果所有变量都设置正确的话,它是可以正常工作的。但是每当出现错误情况(比如用户选择了一个不存在的数据库),Python就会给我以下信息:
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()
4 个回答
9
我来到这里是因为遇到了
类 'psycopg2.errors.InvalidCursorName'
在使用Django的时候。如果你也遇到这个问题,记得要运行makemigrations。
33
当我尝试捕捉错误时,e.pgerror 对于连接错误总是显示为 None。下面的代码块通过直接打印 '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
比如,在密码认证失败的情况下:
Unable to connect!
FATAL: password authentication failed for user "user"
我知道这个问题已经有一年了,但希望能对未来的某个人有所帮助。
5
你现在是用 psycopg2.Error
这个基础类来捕捉所有的错误。你遇到的问题可能是因为 diag
这个属性是在 psycopg2 2.5
版本中新增的。你用的是什么版本呢?
>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)