识别 sqlalchemy.exc.OperationalError
Identifying sqlalchemy.exc.OperationalError
我正在尝试捕获 mysql/sqlalchemy OperationalErrors 并替换 handle access denied (1045) 与 connection refused (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)
我似乎找不到任何关于如何以编程方式区分它们的文档。我深入研究了来源,并认为我可以检查 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 上也找不到支持,从这里我该去哪里?
尝试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 wraps 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
经过更多研究,我发现 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
我正在尝试捕获 mysql/sqlalchemy OperationalErrors 并替换 handle access denied (1045) 与 connection refused (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)
我似乎找不到任何关于如何以编程方式区分它们的文档。我深入研究了来源,并认为我可以检查 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 上也找不到支持,从这里我该去哪里?
尝试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 wraps 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
经过更多研究,我发现 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