2017-02-26 26 views
4

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`") 
+0

ここでエラーをどのように処理しているかを示すコードを編集できますか? – putonspectacles

+0

エラーを捕捉しようとする方法を示すために2番目の編集を追加しました。 – user1718097

答えて

2

いい質問、ノート、read_sqlは「read_sql_tableとread_sql_queryのラッパーです。 sourceを介して読むと、ValueErrorが親とヘルパーの機能の内部で一貫してスローされます。したがって、安全にValueErrorをキャッチして適切に処理できます。 (ソースを見てください)

+0

提案をありがとう...私は見てみましょう。 – user1718097

+0

これは良いヒントです(++)。 @ user1718097、SQLAlchemyの例外をチェックすることもできます(Pandasが対応するソースファイルの 'to_sql()'でこのモジュールを使用するため)... – MaxU

+0

私はこの問題についてもう少し作業を行い、EDITを元の質問。 – user1718097

関連する問題