python - Pandas read_sql() 可以返回哪些异常

标签 python mysql python-3.x pandas pymysql

我有一个用户定义的函数,它使用 pymysql 连接到 mysql 数据库,然后查询数据库并将结果读入 Pandas 数据帧。

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() 可能引起的任何异常。在哪里可以找到可能引发的异常列表?它不在 Pandas 文档 ( http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.read_sql.html ) 中,我在网上找不到任何提示。我可以捕获所有异常,但 Python 社区似乎普遍不赞成这样做。我应该如何捕获 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]))

这很好用(尽管偶然发现需要使用 pymysql.OperationalError 捕获 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 不起作用。我已经尝试了几乎所有我能想到的方法,但仍然无法发现错误。错误消息不应该提供更多关于错误是如何产生的以及如何被捕获的信息吗?显然,我遗漏了一些明显的东西,但我就是找不到解决方案。如有任何建议,我们将不胜感激。

编辑 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`")

最佳答案

好问题,请注意,read_sql 是对“read_sql_table 和 read_sql_query”的包装。通读source , ValueError 始终被抛入父函数和辅助函数中。因此,您可以安全地捕获 ValueError 并进行适当处理。 (请查看源代码)

关于python - Pandas read_sql() 可以返回哪些异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42466052/

相关文章:

mysql - 从 where 子句中的给定集合中选择表中不存在的 ID

mysql - SQL:输出属于某个类别的所有名称,其中该类别中的所有国家/地区都相同

python - 如何在不使用for循环的情况下从数组列表中删除元素

python - Aiogram——为确切的用户设置状态

python - 在 aiohttp 请求中发送用户凭据

python - 处理模块中未定义的全局(python)

python - 了解 LSTM - 层数据维度

C# MYSQL - 我无法插入 bool 值

python - 在 Python 中同时运行 os.system() 多次?

python - 如何从类主体中获取对当前类的引用?