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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:48:00