如何用Python将CSV导入SQLite3并去重(无需逐行遍历)
高效实现CSV增量导入SQLite3数据库
不用逐行遍历CSV或数据库也能搞定!核心思路是利用SQLite的临时表和批量SQL操作,把数据导入临时表后,再通过数据库层面的查询筛选出不存在的数据插入目标表,全程都是批量操作,效率拉满。
前提准备
首先你需要确定目标表有唯一标识(比如主键列,或者设置了唯一约束的列),这是判断数据是否已存在的关键。如果没有的话,也可以用所有列组合来判断,但效率会稍低一点。
完整代码示例
import pandas as pd import sqlite3 # 1. 建立数据库连接 conn = sqlite3.connect('your_database.db') cursor = conn.cursor() # 2. 读取CSV文件到DataFrame df = pd.read_csv('Data.csv') target_table = 'your_table_name' # 替换成你的目标表名 # 3. 将CSV数据导入临时表(批量导入,效率很高) temp_table = 'temp_csv_import' df.to_sql(temp_table, conn, index=False, if_exists='replace') # 4. 构造增量插入的SQL语句 # 替换成你的唯一标识列(比如主键id) unique_key = 'id' # 获取CSV的所有列名,用逗号分隔 column_list = ', '.join(df.columns) # 方法1:用NOT EXISTS筛选不存在的数据(灵活,不依赖唯一约束) insert_query = f""" INSERT INTO {target_table} ({column_list}) SELECT {column_list} FROM {temp_table} WHERE NOT EXISTS ( SELECT 1 FROM {target_table} WHERE {target_table}.{unique_key} = {temp_table}.{unique_key} ) """ # 方法2:用INSERT OR IGNORE(需目标表已设置唯一约束,更简洁) # insert_query = f""" # INSERT OR IGNORE INTO {target_table} ({column_list}) # SELECT {column_list} FROM {temp_table} # """ # 5. 执行SQL并提交 cursor.execute(insert_query) conn.commit() # 6. 清理临时表(可选,SQLite会在连接关闭时自动删除临时表) cursor.execute(f"DROP TABLE IF EXISTS {temp_table}") # 7. 关闭连接 conn.close()
关键细节说明
- 临时表的作用:
df.to_sql批量导入临时表比逐行处理快得多,而且临时表只在当前数据库会话中存在,不会污染你的正式数据。 - 两种插入方式的区别:
NOT EXISTS:不需要目标表有唯一约束,你可以自定义判断数据是否存在的逻辑(比如多列组合判断),灵活性更高。INSERT OR IGNORE:需要目标表对唯一列设置了UNIQUE约束或主键,当插入重复数据时会自动忽略,代码更简洁,但如果有其他约束冲突也会一并忽略,需要根据你的业务场景选择。
- 性能优势:所有筛选和插入操作都是在数据库层面完成的,比Python循环遍历每一行判断快几个量级,尤其适合大文件。
内容的提问来源于stack exchange,提问作者Ivan To
相关产品推荐
相关产品推荐

