如何通过Python对SQL Server表实现存在更新、不存在插入操作?
解决方案
你要的「存在则更新、不存在则插入」逻辑在SQL Server里可以直接用MERGE(合并)语句实现,不需要额外写查询判断逻辑,性能和可靠性都更高,修改后的代码如下:
import pyodbc import pandas as pd # 数据库连接逻辑保持原有配置即可 cnxn = pyodbc.connect(f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={db};UID={user};PWD={password_db}') cursor = cnxn.cursor() # 预写MERGE语句,注意SQL保留关键字(KEY、USER、Table)要用方括号转义 merge_sql = """ MERGE INTO [Table] AS target USING (VALUES (?, ?, ?, ?, ?, ?)) AS source ([USER], SENDER, RECEIVER, DAY, ORIGIN, [KEY]) ON target.[KEY] = source.[KEY] WHEN MATCHED THEN UPDATE SET target.[USER] = source.[USER], target.SENDER = source.SENDER, target.RECEIVER = source.RECEIVER, target.DAY = source.DAY, target.ORIGIN = source.ORIGIN WHEN NOT MATCHED THEN INSERT ([USER], SENDER, RECEIVER, DAY, ORIGIN, [KEY]) VALUES (source.[USER], source.SENDER, source.RECEIVER, source.DAY, source.ORIGIN, source.[KEY]); """ for index, row in dataframe.iterrows(): cursor.execute(merge_sql, row.USER, row.SENDER, row.RECEIVER, row.DAY, row.ORIGIN, row.KEY) cnxn.commit() cursor.close() cnxn.close()
注意事项
- 因为
KEY、USER、Table都是SQL Server的保留关键字,作为表名、字段名使用时必须用方括号[]包裹,否则会触发语法错误,你原有的插入语句也存在这个语法隐患,这里统一做了修正 - 数据量不大的场景用上述逐行执行的方式就足够,如果你要处理的dataframe行数超过1000,可以改为批量拼接VALUES的方式减少数据库交互次数,提升写入效率
- 代码最后增加了数据库连接关闭的逻辑,避免连接泄漏
内容的提问来源于stack exchange,提问作者Hummer
相关产品推荐
相关产品推荐

