使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055

Posted

技术标签:

【中文标题】使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055【英文标题】:Operational error 2055 while exporting pandas dataframe to MySQL using SQLAlchemy 【发布时间】:2018-07-20 13:14:31 【问题描述】:

我第一次使用SQLAlchemy 将大约 600 万条记录导出到 mysql。以下是我收到的错误:

OperationalError: (mysql.connector.errors.OperationalError) 2055: Lost connection to MySQL server at '127.0.0.1:3306', system error: 10053 An established connection was aborted by the software in your host machine

代码:

import pandas as pd
import sqlalchemy

df=pd.read_excel(r"C:\Users\mazin\1-601.xlsx")

database_username = 'root'
database_password = 'aUtO1115'
database_ip       = '127.0.0.1'
database_name     = 'patenting in psis'
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://0:1@2/3'.
                                               format(database_username, database_password, 
                                                      database_ip, database_name), pool_recycle=1, pool_timeout=30).connect()

df.to_sql(con=database_connection, name='sample', if_exists='replace')
database_connection.close()

注意:如果我导出大约 100 条记录,我不会收到错误消息。参考类似帖子后,我添加了pool_recyclepool_timeout参数,但错误仍然存​​在。

【问题讨论】:

如果你要插入 600 万行,你肯定会超过 30 秒的超时时间。您是否尝试过一次全部输入块。 to_sql 有可选参数chunksize 可以使用。 @PerunSS - 当我使用 57600 秒的超时时,我得到了同样的错误。另外,当我使用 chunksize 参数时,它给了我 Programming Error 1064: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '%(Maintenance Status (US))s, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Ma' 附近使用正确的语法 @PerunSS - 使用 chunksize 参数并为 pool_recycle 和 pool_timeout 设置适当的值使代码工作。您想将其发布为答案吗? 【参考方案1】:

问题是您尝试将 600 万行作为一个块导入。这需要时间。使用您当前的配置,pool_recycle 设置为 1 秒,这意味着连接将在 1 秒后关闭,这肯定没有足够的时间插入 6 行。接下来是我的建议:

database_connection = sqlalchemy.create_engine(
    'mysql+mysqlconnector://0:1@2/3'.format(
        database_username, 
        database_password,
        database_ip, database_name
    ), pool_recycle=3600, pool_size=5).connect()
df.to_sql(
    con=database_connection, 
    name='sample', 
    if_exists='replace',
    chunksize=1000
)

这将设置 5 个连接池,回收时间为 1 小时。第二行将一次插入 1000 个(而不是一次插入所有行)。您可以对值进行试验以获得最佳性能。

【讨论】:

这非常有用

以上是关于使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055的主要内容,如果未能解决你的问题,请参考以下文章

将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy

将数据从 sqlalchemy 移动到 pandas DataFrame

使用 SqlAlchemy 和 cx_Oracle 将 Pandas DataFrame 写入 Oracle 数据库时加快 to_sql()

将 pandas 数据框行绑定到 sqlAlchemy 自定义查询

使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据框

如何使用 pandas sqlalchemy 和 psycopg2 处理 NaT