为什么 Sqlalchemy 无法将大量数据插入 MySQL

Why does Sqlalchemy fail to insert big amounts of data to MySQL

我最近从 SQLite 迁移到 MySQL 并开始遇到此类问题。每当我尝试通过 sqlalchemy 使用 pandas' to_sql 超过 100 000 行时,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 数据库还是云中的数据库,都会发生这种情况。

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

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