簡體   English   中英

識別 sqlalchemy.exc.OperationalError

[英]Identifying 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 很陌生,所以我真的很難說。 我在 irc 上也找不到支持,我該去哪里?

試試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

這應該是您正在尋找的。 更多閱讀請參考文檔

編輯

由於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

經過一番研究,我發現 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM