如何使用Python向SQL Server导入CSV数据时避免插入重复记录
问题解决方案
你遇到的重复插入问题是因为现有脚本每次执行都会把CSV里的全部数据无条件插入数据库,没有做旧数据去重校验,可根据你的使用场景选择以下两种修改方案:
方案1:清空表后全量插入(最简便,适合CSV每次存储全量最新数据的场景)
每次执行导入前先清空目标表,再插入CSV里的所有最新数据,修改后的完整代码如下:
import pandas as pd import pyodbc df = pd.read_csv ("C:/Users/Dhilip/Downloads/test.csv") print(df) conn = pyodbc.connect('Driver={SQL Server};' 'Server=DESKTOP-7FCK7FG;' 'Database=test;' 'Trusted_Connection=yes;') cursor = conn.cursor() # 新增:导入前清空目标表 cursor.execute('TRUNCATE TABLE test.dbo.people_info') conn.commit() for row in df.itertuples(): cursor.execute(''' INSERT INTO test.dbo.people_info (Name, Country, Age) VALUES (?,?,?) ''', row.Name, row.Country, row.Age ) conn.commit() # 关闭连接避免资源泄漏 cursor.close() conn.close()
注意:该方案会先清空表中所有旧数据,请确认CSV文件包含所有需要留存的全量数据再使用。
方案2:增量插入(仅插入CSV中数据库不存在的新数据,适合需要增量更新的场景)
修改插入逻辑,仅当对应记录不在数据库中时才执行插入,修改后的核心插入逻辑如下:
for row in df.itertuples(): cursor.execute(''' INSERT INTO test.dbo.people_info (Name, Country, Age) SELECT ?, ?, ? WHERE NOT EXISTS ( SELECT 1 FROM test.dbo.people_info WHERE Name = ? AND Country = ? AND Age = ? ) ''', row.Name, row.Country, row.Age, row.Name, row.Country, row.Age ) conn.commit()
可选优化:如果
Name字段是唯一标识,可以给people_info表的Name字段添加唯一索引,重复插入时会直接触发约束报错,进一步避免脏数据。
内容的提问来源于stack exchange,提问作者sthambi
相关产品推荐
相关产品推荐

