- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个用户定义的函数,它使用 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/
我通过 Pandas 的 read_sql 和外部应用程序 (DbVisualizer) 运行完全相同的查询。 DbVisualizer 返回 206 行,而 pandas 返回 178 行。 我曾尝
我正在尝试做异步等价物 engine = create_engine('sqlite:///./test.db') stmt = session.query(MyTable) data = pd.re
我必须比较两个数据源以查看所有行中的相同记录是否相同。一个数据源来自 Excel 文件,另一个来自 SQL 表。我尝试使用 DataFrame.equals() 就像我过去一样。 然而,这个问题是由于
我们正在使用 pandas read_sql用于检索前端触发的查询结果。为了简化用例,假设用户给出一些参数(表名、子句等),然后我们将其转换为 sql,然后使用 read_sql 执行它。pandas
我有一个数据库接口(interface)类,它从 pandas pd.read_sql 函数返回查询。我想将 pd.read_sql 参数传递给该方法,以便在调用函数时可以使用它,如下所示: impo
我有一个字段月年,格式为 datetime64[ns] 。 如何在 where 子句中使用此字段来获取滚动 12 个月的数据(过去 12 个月的数据)。 以下查询不起作用,但我想要过滤 12 个月数据
我正在遍历 pd.read_sql(query, engine, chunksize=10000) 的结果 我正在使用 engine (sqlalchemy) 设置为 echo=True以便它打印出
我可以访问 MS SQL SERVER 数据库,从中检索数据进行分析。我使用 Mac,因此可以使用 Navicat Essentials for SQL Server 访问数据库。这真的很好用。但是,
我正在尝试使用以下代码通过 python 从 sql 检索数据: query = ("SELECT stuff FROM TABLE WHERE name like %%(this_name)s%")
我试图在两个不同表的比较列之后插入一个标志(匹配/不匹配)。我能够比较两个 mysql 表列但不知道如何插入标志列并获取状态(匹配/不匹配) 下面是一个例子,考虑2个mysql表: 选项卡1: ema
我正在尝试将三个不同 MySQL 表中的几列读取到三个不同的数据帧中。 从数据库中读取并不需要很长时间,但实际上将它们放入数据帧中却相当慢。 start_time = time.time() prin
我有一个数据集 (14gb),我正在尝试使用 chunksize 从 MySQL 中提取数据。但是,我继续收到以下错误: TypeError: read_sql_query() got an unex
我正在使用 pyodbc 和 pandas read_sql 从 Oracle 数据库中提取数据。 当我输入这一行时我没有看到任何错误 df = pd.read_sql(sql_str,cnxn,ch
这是错误还是我做错了什么?我创建了一个 df,将它放在一个 sql 表中,df 和表中有一个带点的列。现在当我从 sql 表中读取 df 时,列名不一样。我写了这段代码是为了让人们可以测试它。 imp
import pandas as pd q = """ select * from tbl where metric = %(my_metric)s ;
我使用 pandas 从 Vertica 数据库读取数据: pd.read_sql(query, self._conn) 但是失败了 UnicodeDecodeError:“utf-8”编解码器无法解
我需要进一步处理 MySQL 查询的结果集作为数据框。 SQL 表包含大约 200 万行和 12 列(数据大小 = 180 MiB)。我正在运行 8 GB 内存的 OS X 10.9。 pandas.
我有一个用户定义的函数,它使用 pymysql 连接到 mysql 数据库,然后查询数据库并将结果读入 Pandas 数据帧。 import pandas as pd import pymysql i
有没有关于如何在 Pandas 中通过 SQL 查询传递参数的示例? 特别是我使用 SQLAlchemy 引擎连接到 PostgreSQL 数据库。到目前为止,我发现以下工作: df = psql.r
我将 MySQL 与 pandas 和 sqlalchemy 结合使用。但是,它非常慢。一个简单的查询,因为这个查询需要超过 11 分钟才能在具有 1100 万行的表上完成。什么行动可以改善这种表现?
我是一名优秀的程序员,十分优秀!