【问题标题】:Why does Sqlalchemy fail to insert big amounts of data to MySQL为什么Sqlalchemy无法向MySQL插入大量数据
【发布时间】:2022-01-16 09:46:06
【问题描述】:

我最近从 SQLite 迁移到 MySQL 并开始遭受此类问题的困扰。每当我尝试通过超过 100 000 行的 sqlalchemy 使用 pandas 的 to_sql 时,sqlalchemy 都会崩溃并显示以下消息。我从来没有遇到过这样的 SQLite 问题(我在没有 sqlalchemy 的情况下使用它)。在 PyCharm 的 SQL 工具中复制这些表时我没有任何问题。但是每当我使用 pd.to_sql、sqlalchemy 和 mysql 的组合时,我就会遇到麻烦。

示例代码

import numpy as np
import pandas as pd

from sqlalchemy import create_engine

table = pd.DataFrame(np.random.rand(1000000, 10))
connection = create_engine(f"mysql+mysqlconnector://{user}:{pw}@{host}/{db}")
table.to_sql('TEST', connection, if_exists='replace', index=False)

错误信息

sqlalchemy.exc.OperationalError: (mysql.connector.errors.OperationalError) 2055: Lost connection to MySQL server at '<host>', system error: 32 Broken pipe[<mySQLQuery>]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

无论我使用本地 mysql 数据库还是云中的数据库,都会发生这种情况。

【问题讨论】:

    标签: python mysql pandas sqlalchemy


    【解决方案1】:

    此错误最常见的原因是服务器超时并关闭了连接。这可能发生在大型数据集上。尝试使用chunksize

    table.to_sql('TEST', connection, chunksize=1000, if_exists='replace', index=False)
    

    【讨论】:

    • 谢谢。我会尝试。你知道为什么 Sqlalchemy 和 mysql 会发生这种情况,而 Sqlite 从未发生过这种情况,即使有数百万行?
    • 你是对的——它有帮助。谢谢,我有很多白发,并且我自己也建立了几个循环来避免这个问题。 :)
    • @MattiH re: "Sqlite 从来没有发生过" - SQLite 不使用数据库服务器;客户端应用直接读写数据库文件,所以没有服务器连接超时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2018-01-03
    • 2019-09-14
    • 2021-11-17
    相关资源
    最近更新 更多