Выявление 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