如何批量导出PostgreSQL数据库所有表为CSV文件?
批量导出PostgreSQL所有表为CSV文件的高效方法
当然有更高效的批量导出方式!不用再手动逐个敲COPY命令啦,这里给你两个实用的方案,帮你一键搞定所有表的导出:
方案1:用psql内置命令直接生成并执行导出语句
PostgreSQL的系统表information_schema.tables存储了所有表的元数据,我们可以通过查询它自动生成每个表的COPY命令,再用psql的\gexec参数直接执行这些命令:
- 进入psql并连接到目标数据库后,执行以下SQL(记得替换schema名称,如果你的表不在
public下):
SELECT 'COPY ' || quote_ident(table_name) || ' TO ''/var/lib/pgsql/csv_exports/' || quote_ident(table_name) || '.csv'' CSV HEADER;' FROM information_schema.tables WHERE table_schema = 'public';
- 在语句末尾加上
\gexec,让psql自动执行查询结果中的每一条COPY命令:
SELECT 'COPY ' || quote_ident(table_name) || ' TO ''/var/lib/pgsql/csv_exports/' || quote_ident(table_name) || '.csv'' CSV HEADER;' FROM information_schema.tables WHERE table_schema = 'public' \gexec
quote_ident()函数会自动处理带特殊字符或关键字的表名,避免语法错误,比直接拼接字符串更安全。
方案2:用Shell脚本批量循环导出
如果你更习惯用Shell脚本操作,可以先导出所有表名,再循环执行导出命令:
- 先导出目标schema下的所有表名到一个文本文件:
psql -d your_database_name -t -c "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';" > table_list.txt
-t参数会去掉psql输出的表头和边框,只保留纯表名。
- 创建一个Shell脚本(比如
export_all_tables.sh):
#!/bin/bash # 替换成你的数据库名称 DB_NAME="your_database_name" # 你的导出目录,和手动导出的路径一致 EXPORT_DIR="/var/lib/pgsql/csv_exports/" # 确保导出目录存在,不存在则创建 mkdir -p "$EXPORT_DIR" # 循环读取每个表名并执行导出 while read -r table; do if [ -n "$table" ]; then psql -d "$DB_NAME" -c "COPY $table TO '$EXPORT_DIR$table.csv' CSV HEADER;" echo "✅ 已导出表: $table -> $EXPORT_DIR$table.csv" fi done < table_list.txt
- 给脚本添加执行权限并运行:
chmod +x export_all_tables.sh ./export_all_tables.sh
注意事项
- 确保PostgreSQL进程对
/var/lib/pgsql/csv_exports/目录有写入权限(你手动导出成功的话,这个应该已经没问题了)。 - 如果需要导出特定schema的表,修改两个方案中
WHERE table_schema = 'public'的条件即可,比如替换成'your_schema'。 - 若要排除系统表,可以在WHERE条件里加上
AND table_type = 'BASE TABLE',避免导出视图或系统自带的表。
内容的提问来源于stack exchange,提问作者Steve Waters




