这是我第一个广泛使用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'
是否有一个简单的catch-all方法来捕获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()
答案 0 :(得分:20)
当我尝试捕获异常时,对于连接错误,e.pgerror始终为None。以下代码块通过直接打印&#39;来解决这个问题。
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"
我意识到这个问题已经有一年了,但希望未来有可能对某人有所帮助
答案 1 :(得分:2)
您正在捕获基类psycopg2.Error
的所有异常。您的问题可能是diag
中psycopg2 2.5
属性是新的。你的版本是什么?
>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)
答案 2 :(得分:1)
由于这里而结束
类'psycopg2.errors.InvalidCursorName'
在Django上。如果是这种情况,请务必进行移民
答案 3 :(得分:0)
从 Python 3.9 (.removesuffix()
, f-strings) 开始我使用
except psycopg2.Error as e:
log.error(f"{type(e).__module__.removesuffix('.errors')}:{type(e).__name__}: {str(e).rstrip()}")
if conn: conn.rollback()
其中 log
是 logger。
连接错误直接存在于 psycopg2 模块中,而语法错误存在于 psycopg2.errors 子模块中。每个 psycopg2 错误消息的末尾都有一个 unwanted newline。