Выявление sqlalchemy.exc.OperationalError - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь перехватить 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 ]

0 голосов
/ 23 января 2019

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

Попробуйте 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
...