如何在Python中将超200列的大pandas dataframe插入SQL Server表
优化方案
方案1:使用pandas内置to_sql方法(最简便,无需手动处理列名)
该方案可自动匹配DataFrame列名与SQL表的字段名,完全不需要手动逐列编写字段,自带批量插入能力,性能远高于原逐行插入逻辑。
import pandas as pd from sqlalchemy import create_engine # 配置连接参数 server = 'yourservername' database = 'AdventureWorks' username = 'username' password = 'yourpassword' # 可根据本地实际安装的驱动版本调整,比如也可以填{SQL Server} driver = 'ODBC Driver 17 for SQL Server' # 构建连接引擎,开启fast_executemany大幅提升批量插入速度 engine = create_engine(f'mssql+pyodbc://{username}:{password}@{server}/{database}?driver={driver}', fast_executemany=True) # 直接写入数据,if_exists可根据需求选:append追加/replace覆盖/fail表存在时报错 df.to_sql(name='mytable', schema='dbo', con=engine, if_exists='append', index=False)
注意:需确保DataFrame的列名和SQL表的字段名完全一致,顺序不影响匹配;index=False表示不把DataFrame的索引列写入SQL表,如有对应需求可改为True
方案2:原生pyodbc自动拼接插入语句(无额外依赖)
如果不想引入SQLAlchemy依赖,可自动从DataFrame提取列名生成插入语句,同时用批量插入替代逐行遍历,性能和易用性都远高于原有实现。
import pyodbc import pandas as pd server = 'yourservername' database = 'AdventureWorks' username = 'username' password = 'yourpassword' cnxn = pyodbc.connect(f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}') cursor = cnxn.cursor() # 开启批量执行优化 cursor.fast_executemany = True # 自动提取列名生成插入语句模板 columns = ', '.join(df.columns) # 自动生成对应数量的参数占位符 placeholders = ', '.join(['?'] * len(df.columns)) insert_sql = f"INSERT INTO dbo.mytable ({columns}) VALUES ({placeholders})" # 批量插入所有数据,替代逐行遍历 data = df.values.tolist() cursor.executemany(insert_sql, data) cnxn.commit() cursor.close() cnxn.close()
该方案不管表有多少列都通用,不用手动修改任何字段相关代码,批量插入效率比逐行插入高几十倍以上,数据量越大优势越明显
内容的提问来源于stack exchange,提问作者doppelherz7
相关产品推荐
相关产品推荐

