如何用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
相关产品推荐
相关产品推荐

