如何将多个CSV文件导入PostgreSQL并新增列存储对应源文件名
多CSV导入PostgreSQL并新增源文件名标识的实现方案
步骤1:创建目标数据表
提前创建正式存储数据的表,新增source_file列用于存储每条记录对应的源文件名,示例建表语句如下(可根据你的CSV实际字段调整列结构):
CREATE TABLE target_table ( -- 下方为CSV文件自带的字段,可自行修改匹配你的CSV结构 id INT, content VARCHAR(255), create_time TIMESTAMP, -- 新增的源文件名列 source_file VARCHAR(255) NOT NULL );
步骤2:导入数据并填充源文件名
提供两种常用实现方案,可根据你的使用场景选择:
方案1:PostgreSQL原生COPY命令(适合少量文件手动导入)
单个文件按以下流程操作,多文件重复执行即可:
- 创建和CSV字段完全匹配的临时表,不需要加
source_file列CREATE TEMP TABLE temp_csv ( id INT, content VARCHAR(255), create_time TIMESTAMP ); - 导入单个CSV到临时表,CSV有表头的话需要加
HEADER参数COPY temp_csv FROM '/你的CSV文件绝对路径/xxx.csv' DELIMITER ',' CSV HEADER; - 把临时表数据插入正式表,同时指定当前导入的文件名
INSERT INTO target_table (id, content, create_time, source_file) SELECT *, 'xxx.csv' FROM temp_csv; - 执行
TRUNCATE TABLE temp_csv;清空临时表,即可继续导入下一个文件。
方案2:Python批量自动导入(适合大量文件批量处理)
无需手动逐个执行命令,一次脚本运行即可完成所有文件导入:
- 先安装依赖包
pip install pandas psycopg2-binary sqlalchemy - 运行批量导入脚本
import os import pandas as pd from sqlalchemy import create_engine # 替换为你自己的PostgreSQL连接信息 pg_engine = create_engine("postgresql://用户名:密码@数据库地址:端口/数据库名") # 替换为你存放CSV文件的文件夹路径 csv_folder = "/your/csv/folder/path" for file_name in os.listdir(csv_folder): if file_name.lower().endswith(".csv"): file_full_path = os.path.join(csv_folder, file_name) # 读取CSV内容 df = pd.read_csv(file_full_path) # 新增源文件名列,赋值为当前文件名 df["source_file"] = file_name # 追加写入PostgreSQL正式表 df.to_sql( name="target_table", con=pg_engine, if_exists="append", index=False ) print("所有CSV文件导入完成")
注意事项
- 使用COPY命令导入时,需要确保PostgreSQL运行账号对CSV文件有读取权限,否则会触发权限报错
- 如果不同CSV的字段结构有差异,导入前需要先统一字段,避免插入失败
- 单文件超过1G的大文件导入,建议拆分分批提交,避免数据库内存占用过高
内容的提问来源于stack exchange,提问作者user17152392
相关产品推荐
相关产品推荐

