PostgreSQL 提供了 copy 命令用于在数据库表与文件之间拷贝数据,通过 copy 命令可以把一个表数据导出到文件中,也可以把文件中的数据导入到表里面。
1. copy 命令语法
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
[ WHERE condition ]
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
TO { 'filename' | PROGRAM 'command' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]
where option can be one of:
FORMAT format_name
FREEZE [ boolean ]
DELIMITER 'delimiter_character'
NULL 'null_string'
HEADER [ boolean ]
QUOTE 'quote_character'
ESCAPE 'escape_character'
FORCE_QUOTE { ( column_name [, ...] ) | * }
FORCE_NOT_NULL ( column_name [, ...] )
FORCE_NULL ( column_name [, ...] )
ENCODING 'encoding_name'
- format 支持的格式包括 csv,text,binary,默认为 text,一般 csv 用的比较多,csv 的格式可以直接用 excel 打开。
- header 表示导出/导入的文件是否带有字段名称。
- filename 是导入/导出的文件名,其存储在数据库服务器,而不是客户端。
2. 表中数据 copy 到文件
将表 t 中的所有数据 copy 到文件中:
copy t to '/tmp/1.csv' with (format csv);
只 copy 表 t 中的部分字段:
copy t(name,age) to '/tmp/1.csv' with (format csv);
copy 出来的数据支持 where 条件过滤:
copy (select * from t where id > 2) to '/tmp/1.csv' with (format csv);
copy 出来的文件带有字段名称:
copy t to '/tmp/1.csv' with (format csv,header true);
3. 文件中的数据 copy 到表
csv 文件导入到表中:
copy t from '/tmp/2.csv' with (format csv);
csv 文件导入表中的部分字段:
copy t(name,age) from '/tmp/1.csv' with (format csv);
csv 文件导入表中,支持 where 条件过滤:
copy t(name,age) from '/tmp/1.csv' with(format csv) where age>10;
带有字段名称的文件数据导入表:
copy t from '/tmp/1.csv' with (format csv, header true) where age > 10;
参考资料:
https://www.postgresql.org/docs/13/sql-copy.html