pymysqlを使用してmysqlデータベースに接続し、データベースに問い合わせて結果をPandasデータフレームに読み込むユーザー定義関数があります。Pandasから返される可能性のある例外read_sql()
import pandas as pd
import pymysql
import getpass
def myGetData(myQuery):
myServer = 'xxx.xxx.xxx.xxx'
myUser = input("Enter MySQL database username: ")
myPwd = getpass.getpass("Enter password: ")
myConnection = pymysql.connect(host=myServer,user=myUser,password=myPwd)
myTempDF = pd.io.sql.read_sql(myQuery, con=myConnection)
myConnection.close()
return myTempDF
myDF = myGetData("SELECT * FROM `myDB`.`myTable`")
私は明確にするため、ここでそれを示していませんでしたが、pymysql.connect()から生じた例外をキャッチするコードを書かれています。私はまた、read_sql()から発生するかもしれない例外をキャッチすることができるようにしたい。何が起きるかもしれない例外のリストを見つけることができますか?パンダのドキュメント(http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.read_sql.html)には載っていないので、オンラインでヒントを見つけることはできません。私はすべての例外をキャッチすることができますが、それは一般的にPythonコミュニティに嫌われているようです。 read_sql()によって発生した例外をどのようにキャッチする必要がありますか?私はこの上でいくつかのより多くの仕事をしてきたし、私が何のエラーが生成されている知っている場合でも、それは例外をキャッチするためにストレートフォワードではないようです
EDIT
。たとえば、上記のコードで、ユーザー名やパスワードを誤って入力すると、操作上のエラーが発生します。私が使用してこのエラーをキャッチすることができました
OperationalError: (1045, "Access denied for user 'yyy'@'xxx.xxx.xxx.xxx' (using password: YES)")
:最終ラインやエラーレポートは、何かのように読み取ります(正常に動作します
try:
phjConnection = pymysql.connect(host=phjServer, user=phjUser, password=phjPwd)
except pymysql.OperationalError as e:
print("\nAn OperationalError occurred. Error number {0}: {1}.".format(e.args[0],e.args[1]))
OperationalErrorを使用してキャッチするために必要なことを発見したがpymysql.OperationalErrorは偶然でした)。
ここで、関数の次の部分では、real_sql()は上で作成した接続を使用してSQLクエリを実行します。私は間違ったテーブル名を持つわざと間違ったクエリが含まれている場合、別のOperationalErrorはDatabaseError続い発生します
OperationalError: (1142, "SELECT command denied to user 'yyy'@'xxx.xxx.xxx.xxx' for table 'table'")
During handling of the above exception, another exception occurred:
DatabaseError: Execution failed on sql 'SELECT * FROM `db`.`table`': (1142, "SELECT command denied to user 'yyy'@'xxx.xxx.xxx.xxx' for table 'table'")
しかし、私は今、私はこの第二のOperationalErrorをキャッチする方法として完全に当惑しています。以前使用したpymysql.OperationalErrorは機能しません。私は思うことがほとんどすべてを試みたが、まだエラーをキャッチすることはできません。エラーメッセージは、どのようにエラーが生成され、どのようにキャッチされるのかを少し詳しく知っているべきではありませんか?明らかに、私は何かが分からないが、私は解決策を見つけることができません。任意の提案をいただければ幸いです。
コメントに応答して、EDIT 2
次のように、私は今、例外をキャッチしています:
import pandas as pd
import pymysql
import getpass
def myGetData(myQuery):
myServer = 'xxx.xxx.xxx.xxx'
myUser = input("Enter MySQL database username: ")
myPwd = getpass.getpass("Enter password: ")
try:
myConnection = pymysql.connect(host=myServer,user=myUser,password=myPwd)
except pymysql.OperationalError as e:
# Catching this exception works fine if, for example,
# I enter the wrong username and password
print("\nAn OperationalError occurred. Error number {0}: {1}.".format(e.args[0],e.args[1]))
try:
myTempDF = pd.io.sql.read_sql(myQuery, con=myConnection)
except pymysql.OperationalError as e:
# However, this error isn't picked up following an incorrect
# SQL query despite the error message saying that an
# OperationalError has occurred.
# Many variations on this theme have been tried but failed.
print("\nAn error occurred. Error number {0}: {1}.".format(e.args[0],e.args[1]))
myConnection.close()
return myTempDF
myDF = myGetData("SELECT * FROM `myDB`.`myTable`")
ここでエラーをどのように処理しているかを示すコードを編集できますか? – putonspectacles
エラーを捕捉しようとする方法を示すために2番目の編集を追加しました。 – user1718097