문제 설명
sqlalchemy.exc.OperationalError 식별 (Identifying sqlalchemy.exc.OperationalError)
mysql/sqlalchemy OperationalErrors를 잡아서 핸들 액세스 거부됨(1045)을 연결 거부됨(2003)과 다르게 바꾸려고 합니다.
6sqlalchemy.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을 처음 접하므로 말하기가 정말 어렵습니다. 나는 할 수 없었다
참조 솔루션
방법 1:
After some more research, I found the mysql error code to be in err.orig.args[0]
. So the Answer is:
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
방법 2:
Try 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
This should be what you're looking for. Refer to the documentation for more reading
Edit
As OperationalError wraps DBAPIError, that has a code
argument. Most likely just replace args[0]
with code
. Like so:
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
(by Gamification、Gamification、Jab)