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`")
오류를 어떻게 처리하는지 보여주는 코드를 편집 할 수 있습니까? – putonspectacles
두 번째 편집을 추가하여 오류를 잡는 방법을 보여줍니다. – user1718097