识别sqlalchemy.exc.OperationalError

Gam*_*ion 7 python sqlalchemy python-db-api

我试图捕获mysql/sqlalchemy OperationalErrors并替换句柄访问被拒绝(1045)与连接被拒绝(2003)

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user … (Background on this error at: http://sqlalche.me/e/e3q8)
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)") (Background on this error at: http://sqlalche.me/e/e3q8)
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到任何关于如何以编程方式区分这些文档的文档.我潜入了资源,并认为我可以检查err.orig.original_exception.errno的值,但事实并非如此.

编辑:似乎没有为访问被拒绝定义err.orig,这可能是一个错误.

try:
  engine.scalar(select([1]))
except sqlalchemy.exc.OperationalError as err:
  if err_______:
    print("Access Denied")
  elifif err_______:
    print("Connection Refused")
  else:
    raise
Run Code Online (Sandbox Code Playgroud)

这个问题确实让我感到烦恼,甚至连赏金都没有消息.我开始相信它必须是sqlalchemy中的一个错误,但sqlalchemy文档在这方面并不是很具描述性,而且我对sqlalchemy和python很新,所以我真的很难说.我也找不到对irc的支持,我从哪里开始?

Gam*_*ion 4

经过更多研究,我发现 mysql 错误代码位于err.orig.args[0]. 所以答案是:

try:
  engine.scalar(select([1]))
except sqlalchemy.exc.OperationalError as err:
  if err.orig.args[0]==1045:
    print("Access Denied")
  elif err.orig.args[0]==2003:
    print("Connection Refused")
  else:
    raise
Run Code Online (Sandbox Code Playgroud)