Выявление sqlalchemy.exc.OperationalError

Я пытаюсь поймать 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)

Я просто не могу найти какую-либо документацию о том, как различать это программно. Я погрузился в источники и подумал, что могу проверить значение 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 в целом, поэтому мне очень сложно об этом сказать. Я не смог найти поддержку ирк, куда мне идти отсюда?

2 ответа

Решение

После еще одного исследования я обнаружил, что код ошибки 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

Пытаться 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

Это должно быть то, что вы ищете. Обратитесь к документации для получения дополнительной информации.

редактировать

Взгляните на 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
Другие вопросы по тегам