Pandas read_sql() - 属性错误: 'Engine' 对象没有 'cursor' 属性。

9
我正在尝试使用Python3+SQLAlchemy+pymysql和pandas read_sql()方法从MySQL查询中读取数据。 我尝试遵循以下教程 -

https://pythondata.com/quick-tip-sqlalchemy-for-mysql-and-pandas/

https://www.youtube.com/watch?v=M-4EpNdlSuY

https://www.programcreek.com/python/example/101381/pandas.read_sql

一切看起来都很好,与代码有关

import pandas
import sqlalchemy
engine = sqlalchemy.create_engine('mysql+pymysql://root:mypass@example.com:3306/mydatabase')
df = pandas.read_sql("SELECT * FROM persons", con = engine)

收到以下错误 -

AttributeError:'Engine'对象没有属性'游标'

当我尝试传递“connection”变量而不是“engine”,如下所示 -

import pandas
import sqlalchemy
engine = sqlalchemy.create_engine('mysql+pymysql://root:mypass@example.com:3306/mydatabase')
connection = engine.connect()
df = pandas.read_sql("SELECT * FROM persons", con = connection)

它说 -

属性错误:'Connection'对象没有'cursor'属性

我做错了什么?


奇怪。你能试试使用 pandas.read_sql_query() 吗?安装了哪些版本的 pandas 和 sqlalchemy? - codeape
4个回答

14

参考 - https://github.com/pandas-dev/pandas/issues/23030#issuecomment-428140488

当我执行以下操作时,问题消失了:

  • 保存工作簿
  • 重启电脑
  • 重新加载

看起来好像有一些缓存。我可以通过传递“engine”引用来使用 read_sql() 和其他 pandas SQL 函数。

import pandas
import sqlalchemy
engine = sqlalchemy.create_engine('mysql+pymysql://root:mypass@example.com:3306/mydatabase')
df = pandas.read_sql("SELECT * FROM persons", con = engine)

2
感谢您的回答,我尝试关闭并重新启动了我的Jupyter笔记本电脑,这实际上解决了问题。不需要重启电脑。谢谢。 - Johann
对我来说非常有效!Jupyter 应该一定要解决这个问题,否则我将浪费 2-3 小时尝试调试此问题。 - Mitaksh Gupta
数小时的调试,最终得到了正确答案。非常感激。 - Lalo

2
我认为您正在寻找pyodbc,而sqlalchemy是另一种查询数据库的方式,请参考https://towardsdatascience.com/sqlalchemy-python-tutorial-79a577141a91
import sqlalchemy as sq
engine = sq.create_engine('mysql+pymysql://root:mypass@example.com:3306/mydatabase')
connection = engine.connect()
metadata = sq.MetaData()
persons = sq.Table('persons', metadata, autoload=True, autoload_with=engine)

Ret = connection.execute(sq.select([persons]))
youdf=pd.DataFrame(Ret.fetchall())

1
在使用 OP 的语法从旧笔记本中升级 pandas 和 sqlalchemy 后,我收到了“AttributeError: 'Engine' object has no attribute 'execution_options'”错误,而使用您的查询方式可以解决该问题。 - Skippy le Grand Gourou

0

我正在使用Python 3.10和Alchemy 1.4在Win10上使用MySQL。

我尝试了各种选项,但都没有成功。这里是一个解决方法,似乎让大家都很满意。

`metadata_obj = MetaData() tbl_test= Table("test", metadata_obj, autoload_with=engine)`

with engine.connect() as sql_con:
    qry = select(tbl_test)
    resultset = sql_con.execute(qry)
    results_as_dict = resultset.mappings().all()
    df = pd.DataFrame(results_as_dict)
    pprint(df)

`


0

这可能是由于版本不匹配引起的。我曾经遇到过类似的错误,我的旧笔记本电脑曾经运行得很好:

AttributeError: 'Engine' object has no attribute 'execution_options'

经过几次测试,我发现问题出现在 pandas 1.1.0 上。在 发布说明 中,SQLAlchemy 的最低版本为 1.1.4。将 SQLAlchemy 升级到此版本即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接