我在用pycharm运行项目,执行sql语句的时候,好端端的,之前运行pandas读取sql表是没有问题的,这几天就遇到这个错误:
AttributeError: ‘OptionEngine’ object has no attribute ‘execute’
之前也没有遇到这个问题呀,不知道是不是sql的版本发生更改了?
网上搜集发现,这个错误通常意味着你尝试在一个 OptionEngine
对象上访问一个不存在的 execute
方法。
问题的原因:
主要是这两个原因引起的:
1.SQLAlchemy 版本问题:
这个是比较常见可能发生的。
如果你在使用 SQLAlchemy 2.0.0 或更高版本,create_engine()
返回的是 OptionEngine
对象,而不是之前的 Engine
对象。
那么OptionEngine
对象就没有 execute
方法,这个时候就会抛出 “‘OptionEngine’ object has no attribute ‘execute’” 这个错误了。
2.对象传错了:
在使用read_sql 的方法时,本来是要传递一个数据库连接对象,而不是一个 Engine
对象,可以检查一下代码,看看是不是这个对象传错了。
还有一种说法是, Engine
对象没有 execute
方法,而 Connection
对象有。正确的做法是使用 engine.connect()
来获取一个 Connection
对象,然后将其传递给 pd.read_sql
或 pd.read_sql_query
方法。
解决方法:
1. 使用正确的连接对象:
针对上面第2条可能导致这个错误的原因,我们可以在调用 read_sql_query()
方法时,传递一个连接对象,是通过 engine.connect()
获取,而不是一个 Engine
对象。
例如:
import pandas as pd
from sqlalchemy import create_engine, text
engine = create_engine('mysql+pymysql://root:root1234@127.0.0.1:3308/beststock')
sql = "select * FROM table_name limit 10"
df = pd.read_sql(sql, engine.connect()) # 使用 engine.connect() 获取 Connection 对象
print(df)
这样可以确保传递给 read_sql_query()
的是一个正确的连接对象,而不是 OptionEngine
对象。
(但是我也尝试了这个方法来修改我的代码,也没法子解决我的问题;看来我的问题不在代码上)
2. 升级 或者 降级 SQLAlchemy:
根据官方文档,将 SQLAlchemy 升级到 2.1.0 或以上版本可以解决此问题。我们可以在cmd上运行这个命令升级 SQLAlchemy:
pip install --upgrade SQLAlchemy
这将确保您使用的是支持 execute
方法的 Engine
对象。
如果升级 SQLAlchemy 不方便,您也可以考虑降级到 1.4.32 或更早的版本,这些版本不会导致这个问题。例如:
pip install SQLAlchemy==1.4.32
(但是这两个方法我也尝试了,更新也成功了,但是问题还是仍然存在)
3. 个人经验: cv大法 :
本人尝试了上面的版本,全部都不成功的情况下,我还是用回那一招,替换原来的安装包的文件。
具体的安装包在上面资源处,需要的伙伴可以自取呀~
详细点的替换方法见(做法同) :
【Python】pandas 和numpy版本不兼容怎么办?遇到numpy.dtype size change的解决方法(解决方法篇)
PS,重点提醒: 在替换包的时候,由于版本问题,导入包会有不匹配的风险,建议原来的包不要直接替换或者删除,先重命名,或者备份一份,再把后面的包导入,会比较好!