使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055
Operational error 2055 while exporting pandas dataframe to MySQL using SQLAlchemy
我第一次使用 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-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_recycle
和pool_timeout
参数,但错误仍然存在。
问题是您正试图将 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
将大约 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-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_recycle
和pool_timeout
参数,但错误仍然存在。
问题是您正试图将 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(而不是一次插入所有行)。您可以试验各种值以获得最佳性能。