从psycopg2异常中获取错误信息

26 投票
4 回答
74599 浏览
提问于 2025-04-18 10:32

这是我第一次在项目中大量使用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 个回答

2

自从Python 3.9版本开始,我使用了

except psycopg2.Error as e:
  log.error(f"{type(e).__module__.removesuffix('.errors')}:{type(e).__name__}: {str(e).rstrip()}")
  if conn: conn.rollback()

这里的log是一个日志记录器

连接错误直接在psycopg2模块里,而语法错误则在psycopg2.errors这个子模块中。每个psycopg2错误信息的结尾都有一个多余的换行符

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)

撰写回答