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

如何使用Python 3更快速地将批量CSV数据导入SQL Server

跨服务器CSV导入SQL Server优化方案

当前适用环境:Windows系统 + Python 3,CSV文件与目标SQL Server异机部署。

方案1:使用SQL Server官方BCP工具(推荐,性能最优)

BCP是微软官方推出的SQL Server批量导入导出工具,性能比Pandas逐行插入高2个数量级以上,25万条数据导入耗时通常在10秒以内。

  • 操作步骤:
    1. 确保运行Python脚本的设备已安装SQL Server命令行工具(默认安装SQL Server客户端会自带,也可单独安装)
    2. 将源CSV所在文件夹配置为共享文件夹,为SQL Server服务账号分配共享路径的读取权限
    3. 用Python调用subprocess执行bcp命令即可,无需处理路径转义问题
      示例代码:
import subprocess

# 配置参数
csv_path = r"\\源服务器IP\共享文件夹\目标文件.csv" # 源CSV的UNC共享路径
server = "目标SQL Server地址"
database = "目标库名"
table = "目标表名"
username = "SQL登录账号"
password = "SQL登录密码"

# 拼接bcp命令
bcp_cmd = f'bcp {database}.dbo.{table} in "{csv_path}" -S {server} -U {username} -P {password} -c -t, -r "\\n" -F 2'
# 参数说明:-c 用字符类型导入;-t 字段分隔符为逗号;-r 行分隔符为换行符;-F 2 从第二行开始导入(跳过表头)

# 执行命令
result = subprocess.run(bcp_cmd, shell=True, capture_output=True, text=True)
if result.returncode == 0:
    print("导入成功")
else:
    print(f"导入失败,错误信息:{result.stderr}")

方案2:使用pyodbc的fast_executemany批量插入(纯Python实现,无需额外工具)

如果不想依赖外部工具,只需修改原有Pandas导入逻辑的连接参数,即可将导入速度提升100倍以上,3000条数据导入耗时不超过2秒,25万条数据可在1分钟内完成导入。

  • 操作步骤:
    1. 安装依赖:pip install pandas pyodbc sqlalchemy
    2. 示例代码:
import pandas as pd
from sqlalchemy import create_engine

# 配置连接字符串,开启fast_executemany参数
conn_str = "mssql+pyodbc://{用户名}:{密码}@{SQL Server地址}/{库名}?driver=ODBC+Driver+17+for+SQL+Server&fast_executemany=True"
engine = create_engine(conn_str)

# 读取CSV,仅保留需要的列降低内存占用
df = pd.read_csv("你的CSV本地/共享路径", usecols=["Column1"])

# 批量导入,每次提交1万条
df.to_sql(name="目标表名", con=engine, if_exists="append", index=False, chunksize=10000)

方案3:修复BULK INSERT的路径转义问题

之前的双反斜杠报错是Python字符串转义导致的,只需将路径中的反斜杠替换为SQL Server兼容的正斜杠即可解决,无需修改原有BULK INSERT逻辑。

  • 示例代码:
import pyodbc

conn = pyodbc.connect("DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={服务器地址};DATABASE={库名};UID={账号};PWD={密码}")
cursor = conn.cursor()

# 将路径中的反斜杠替换为正斜杠,彻底避免转义报错
csv_path = r"\\源服务器IP\共享文件夹\目标文件.csv".replace("\\", "/")

# 拼接BULK INSERT语句
bulk_sql = f"""
BULK INSERT 目标表名
FROM '{csv_path}'
WITH (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\\n',
    FIRSTROW = 2,
    TABLOCK
)
"""
cursor.execute(bulk_sql)
conn.commit()
cursor.close()
conn.close()

注意事项

  • 异机访问CSV需要先将源CSV所在文件夹配置为共享文件夹,为对应访问账号(SQL Server服务账号/脚本执行账号)分配只读权限
  • 多个文件批量处理时,直接遍历文件列表循环执行对应导入逻辑即可,无需额外调整核心导入代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:09:02