2017-02-26 1 views
4

pymysql을 사용하여 mysql 데이터베이스에 연결 한 다음 데이터베이스를 조회하고 결과를 팬더 데이터 프레임으로 읽는 사용자 정의 함수가 있습니다.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)에 없으므로 온라인에서 힌트를 찾을 수 없습니다. 나는 모든 예외를 잡을 수 있었지만 파이썬 커뮤니티에 의해 일반적으로 눈살을 찌푸리게 한 것 같습니다. read_sql()에 의해 발생 된 예외는 어떻게 잡아야합니까?

편집

나는이에 대한 몇 가지 더 많은 작업을했습니다 그리고 내가 생성되는 어떤 오류 알고있는 경우에도,이 예외를 잡기 위해 곧장 앞으로 아니다 것으로 보인다. 예를 들어 위의 코드에서 사용자 이름 및/또는 암호를 잘못 입력하면 작동 오류가 발생합니다. 내가 사용이 오류를 잡을 수있었습니다

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가 발생했습니다.)

이제 함수의 다음 부분에서 pandas 함수 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가 작동하지 않습니다. 나는 내가 생각할 수있는 모든 것을 시도했지만 여전히 오류를 잡을 수는 없다. 오류 메시지가 생성 된 방법과 캐치 될 수있는 방법에 대해 조금 더 유익해야합니까? 분명히 나는 ​​명백한 것을 놓치고 있지만 솔루션을 찾을 수 없다. 모든 제안을 부탁드립니다.

주석에 대한 응답으로 편집이

다음과 같이 지금은 예외를 잡기 오전 :

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

두 번째 편집을 추가하여 오류를 잡는 방법을 보여줍니다. – user1718097

답변

2

좋은 질문, 참고, read_sql는 'read_sql_table 및 read_sql_query의 래퍼입니다. source을 통해 읽기, ValueError은 부모 및 도우미 함수 내부에서 지속적으로 throw됩니다. 따라서 안전하게 ValueError을 붙잡고 적절하게 처리 할 수 ​​있습니다. (소스를 살펴보십시오.)

+0

제안 해 주셔서 감사합니다 ... 한번 살펴 보겠습니다. – user1718097

+0

좋은 힌트 (++)입니다. @ user1718097, SQLAlchemy 예외를 체크하고 싶을 수도 있습니다 (팬더가'to_sql()'에서이 모듈을 해당 소스 파일에서 사용함) ... – MaxU

+0

이 문제에 대해 좀 더 연구했고 EDIT를 원래의 질문. – user1718097

관련 문제