sqlalchemy.exc.OperationalError 식별 (Identifying sqlalchemy.exc.OperationalError)


문제 설명

sqlalchemy.exc.OperationalError 식별 (Identifying sqlalchemy.exc.OperationalError)

mysql/sqlalchemy OperationalErrors를 잡아서 핸들 액세스 거부됨(1045)을 연결 거부됨(2003)과 다르게 바꾸려고 합니다.

6
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을 처음 접하므로 말하기가 정말 어렵습니다. 나는 할 수 없었다


참조 솔루션

방법 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 GamificationGamificationJab)

참조 문서

  1. Identifying sqlalchemy.exc.OperationalError (CC BY‑SA 2.5/3.0/4.0)

#SQLAlchemy #Python #python-db-api






관련 질문

타임스탬프 열에서 연도만 검색하는 방법은 무엇입니까? (How to retrieve only the year from timestamp column?)

SQLAlchemy: 'in_'에 대한 필터는 효과가 없습니다. (SQLAlchemy: Filter on 'in_' has no effect)

sqlalchemy 쿼리 필터에 변수를 추가하고 문자열 쿼리로 변환하려면 어떻게 합니까? (How do I add a variable to a sqlalchemy query filter and convert it to a string query?)

자동 플러시를 비활성화하고 자동 커밋이 작동하지 않는 후 Flask sqlAlchemy (Flask sqlAlchemy after disable autoflush and autocommit not working)

R과 반짝이는 다층 테이블을 만드는 방법은 무엇입니까? (How to make multiple layered table form with R and shiny?)

sqlalchemy.exc.OperationalError 식별 (Identifying sqlalchemy.exc.OperationalError)

ImportError: 'PY2' 이름을 가져올 수 없습니다. (ImportError: cannot import name 'PY2')

SQLAlchemy: 부분적으로 지정된 관계 (SQLAlchemy: partially specified relationship)

SQLAlchemy를 사용하여 데이터베이스의 기존 테이블에 연결 (Connect to existing tables in database using SQLAlchemy)

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL 제약 조건 실패: user.words (sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: user.words)

날짜 시간에 대한 ValidationError (ValidationError for datetime)

pytest에서 SAWarning을 무시하는 방법 (How to ignore SAWarning in pytest)







코멘트