You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python循环按90行拆分DataFrame批量插入SQL Server?

批量拆分DataFrame并插入SQL Server(适配单批次90行限制)

直接用循环按固定批次大小拆分DataFrame,自动处理所有行的插入,替代手动拆分的低效操作:

import pandas as pd
import numpy as np
from sqlalchemy import create_engine

# 初始化SQL Server连接引擎(根据实际配置修改)
# engine = create_engine('mssql+pyodbc://<用户名>:<密码>@<服务器>/<数据库>?driver=ODBC+Driver+17+for+SQL+Server')

# 生成示例数据
df = pd.DataFrame(np.random.randint(0,100,size=(2000, 4)), columns=['Name', 'Age','food','tree'])

batch_size = 90
total_rows = len(df)

# 循环拆分并批量插入
for start_idx in range(0, total_rows, batch_size):
    end_idx = start_idx + batch_size
    # 按行位置切片获取当前批次数据
    batch_data = df.iloc[start_idx:end_idx, :]
    # 插入到SQL Server
    batch_data.to_sql(
        name="tableName",
        schema='dbo',
        con=engine,
        method='multi',
        if_exists='append',
        index=False  # 不插入DataFrame的索引列
    )
    print(f"完成第 {start_idx//batch_size + 1} 批插入,共 {len(batch_data)} 行")

关键细节说明

  • 使用range(0, total_rows, batch_size)自动生成每个批次的起始索引,步长设为90,最后一批不足90行时会自动处理(比如2000行的最后一批为20行)
  • 用iloc进行位置切片,适配DataFrame索引非连续整数的场景,比loc更可靠
  • if_exists='append'确保数据追加到现有表中,不会覆盖已有数据
  • index=False避免将DataFrame的索引列写入数据库(如果你的表不需要该列)

可选优化:添加异常处理

避免单个批次插入失败导致整个流程中断,可加入异常捕获:

for start_idx in range(0, total_rows, batch_size):
    end_idx = start_idx + batch_size
    batch_data = df.iloc[start_idx:end_idx, :]
    try:
        batch_data.to_sql(
            name="tableName",
            schema='dbo',
            con=engine,
            method='multi',
            if_exists='append',
            index=False
        )
        print(f"成功插入第 {start_idx//batch_size + 1} 批,共 {len(batch_data)} 行")
    except Exception as e:
        print(f"第 {start_idx//batch_size + 1} 批插入失败:{str(e)}")
        # 若需要终止流程,取消下一行注释
        # raise

内容的提问来源于stack exchange,提问作者PyBoss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:42:24