Python的pandas库中的DataFrame的`to_sql`方法写入报错处理

当使用Python的pandas库中的DataFrame的`to_sql`方法写入数据库时,如果数据量较大,可能会遇到"_mysql_connector.MySQLInterfaceError: MySQL server has gone away"的报错。这通常是因为连接到MySQL服务器的连接丢失,可能是由于长时间的不活动或服务器负载过重引起的。针对这个问题,可以尝试以下解决方案:

1. 使用pandas的`chunksize`参数:
   如果你的DataFrame太大而无法一次性插入,可以在`to_sql`方法中使用`chunksize`参数。这将把DataFrame拆分成较小的块,并逐个插入,减轻服务器的负担。

import pandas as pd
from sqlalchemy import create_engine

# 替换这些变量为你的连接详细信息
DB_USER = 'your_username'
DB_PASS = 'your_password'
DB_HOST = 'your_host'
DB_NAME = 'your_database'

# 创建引擎
engine = create_engine(f'mysql+mysqlconnector://{DB_USER}:{DB_PASS}@{DB_HOST}/{DB_NAME}')

# 你的DataFrame
your_dataframe = ...

# 批量插入的块大小
chunk_size = 1000

# 遍历块并插入到数据库
for i in range(0, len(your_dataframe), chunk_size):
    chunk = your_dataframe[i:i + chunk_size]
    chunk.to_sql('your_table', engine, if_exists='append', index=False)

2. 使用SQLAlchemy的`executemany`:
   你可以使用SQLAlchemy的`executemany`方法进行高效的批量插入。这种方法比逐行插入更快。

import pandas as pd
from sqlalchemy import create_engine

# 替换这些变量为你的连接详细信息
DB_USER = 'your_username'
DB_PASS = 'your_password'
DB_HOST = 'your_host'
DB_NAME = 'your_database'

# 创建引擎
engine = create_engine(f'mysql+mysqlconnector://{DB_USER}:{DB_PASS}@{DB_HOST}/{DB_NAME}')

# 你的DataFrame
your_dataframe = ...

# 将DataFrame转换为元组的列表
data_to_insert = [tuple(row) for row in your_dataframe.to_numpy()]

# 定义SQL插入语句
sql_insert = "INSERT INTO your_table (column1, column2, ...) VALUES (%s, %s, ...)"

# 使用executemany执行插入语句
with engine.connect() as connection:
    connection.execute(sql_insert, data_to_insert)

请记得将`'your_table'`、`column1`、`column2`等替换为你实际的表名和列名。

采用这些解决方案应该有助于在使用pandas的`to_sql`方法将大量数据插入数据库时避免"MySQL server has gone away"错误。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值