如何使用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秒以内。
- 操作步骤:
- 确保运行Python脚本的设备已安装SQL Server命令行工具(默认安装SQL Server客户端会自带,也可单独安装)
- 将源CSV所在文件夹配置为共享文件夹,为SQL Server服务账号分配共享路径的读取权限
- 用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分钟内完成导入。
- 操作步骤:
- 安装依赖:
pip install pandas pyodbc sqlalchemy - 示例代码:
- 安装依赖:
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
相关产品推荐
相关产品推荐

