识别sqlalchemy.exc.OperationalError

时间:2019-01-08 23:47:54

标签: python sqlalchemy python-db-api

我正在尝试捕获mysql / sqlalchemy OperationalErrors并替换与拒绝连接(2003)不同的句柄访问被拒绝(1045)

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)

我似乎找不到任何有关如何以编程方式区分这些内容的文档。我深入研究资料来源,认为可以检查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

这个问题确实使我烦恼,甚至连赏金都快用完了,没有消息。我开始相信它一定是sqlalchemy中的错误,但是sqlalchemy文档在这方面不是很具有描述性,而且我对sqlalchemy和python还是陌生的,所以我很难说出来。我也无法在irc上找到支持,我从这里去哪里?

2 个答案:

答案 0 :(得分:1)

经过更多研究,我发现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

答案 1 :(得分:0)

尝试err.args[0]

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

这应该是您要寻找的。请参阅documentation了解更多信息

修改

看一下API,因为OperationalError包装了DBAPIError,并且有一个code参数。在我的示例中,很可能只需将args[0]替换为code。像这样:

try:
  engine.scalar(select([1]))
except sqlalchemy.exc.OperationalError as err:
  if err.code == 1045:
    print("Access Denied")
  elif err.code == 2003:
    print("Connection Refused")
  else:
    raise