使用df.to_sql()时出现AttributeError: 'Connection'对象没有属性'connect'。

11
我正在尝试通过pandas数据框将从网站检索到的数据存储到MySQL数据库中。然而,当我调用df.to_sql()函数时,编译器会给我一个错误消息,说:AttributeError: 'Connection' object has no attribute 'connect'。我测试了几次,确信既没有连接问题也没有表存在问题。代码本身有什么问题吗?我使用的代码如下:
    from sqlalchemy import create_engine, text
    import pandas as pd
    import mysql.connector

    
    config = configparser.ConfigParser()
    config.read('db_init.INI')
    password = config.get("section_a", "Password")
    host = config.get("section_a", "Port")
    database = config.get("section_a", "Database")

    engine = create_engine('mysql+mysqlconnector://root:{0}@{1}/{2}'.
                           format(password, host, database),
                           pool_recycle=1, pool_timeout=57600, future=True)
    
    conn = engine.connect()
    df.to_sql("tableName", conn, if_exists='append', index = False)

完整的堆栈跟踪如下:

Traceback (most recent call last):
  File "/Users/chent/Desktop/PFSDataParser/src/FetchPFS.py", line 304, in <module>
    main()
  File "/Users/chent/Desktop/PFSDataParser/src/FetchPFS.py", line 287, in main
    insert_to_db(experimentDataSet, expName)
  File "/Users/chent/Desktop/PFSDataParser/src/FetchPFS.py", line 89, in insert_to_db
    df.to_sql(tableName, conn, if_exists='append', index = False)
  File "/Users/chent/opt/anaconda3/lib/python3.9/site-packages/pandas/core/generic.py", line 2951, in to_sql
    return sql.to_sql(
  File "/Users/chent/opt/anaconda3/lib/python3.9/site-packages/pandas/io/sql.py", line 698, in to_sql
    return pandas_sql.to_sql(
  File "/Users/chent/opt/anaconda3/lib/python3.9/site-packages/pandas/io/sql.py", line 1754, in to_sql
    self.check_case_sensitive(name=name, schema=schema)
  File "/Users/chent/opt/anaconda3/lib/python3.9/site-packages/pandas/io/sql.py", line 1647, in check_case_sensitive
    with self.connectable.connect() as conn:

AttributeError: 'Connection' object has no attribute 'connect'

我使用的pandas版本是1.4.4,sqlalchemy是2.0

我尝试执行了几个SQL查询,例如CREATE TABLE xxx IF NOT EXISTSSELECT * FROM,所有这些都给了我想要看到的结果。


6
删除您的代码行 conn = engine.connect(),并将另一行改为 df.to_sql("tableName", engine, if_exists='append', index = False) - nacho
2个回答

15

我也遇到了这个问题。Pandas 1.x 还不支持 SqlAlchemy 2根据相关的 Github issue 显示, 下一个版本的 Pandas 将需要 sqlalchemy<2.0。目前,您必须使用例如以下命令降级到 SqlAlchemy 1.4.x:

pip install --upgrade SQLAlchemy==1.4.46

该问题是由Pandas版本与SqlAlchemy 2.0不兼容引起的。 SqlAlchemy 2.0在2023年1月28日发布,而即使是当时最新的Pandas版本1.5.3也是在1月19日发布的。

Pandas确实支持sqlalchemy.engine.Connection。从文档中可以看到:

cons : qlalchemy.engine.(Engine or Connection) or sqlite3.Connection

使用SQLAlchemy可以使用该库支持的任何数据库。对于sqlite3.Connection对象提供了对旧版的支持。用户需要负责处理SQLAlchemy连接相关操作和关闭连接。请参阅这里

我将SqlAlchemy降级到1.4.46版本,to_sql不再报错。

如果您使用pip,可以使用以下命令进行降级:

pip install --upgrade SQLAlchemy==1.4.46

或者

pip install SQLAlchemy
pip install SQLAlchemy==1.4.46

1
我遇到了同样的问题。在2023年3月18日星期六,甚至发布了SQLAlchemy 1.4.47版本。更一般的方法是pip install SQLAlchemy==1.* - DataJanitor

0

我曾经遇到过同样的问题,但是(正如@nacho在评论中建议的那样)当我将连接对象替换为sqlalchemy引擎时,在DataFrame.to_sql()参数中解决了这个问题。


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