CSV
(逗号分隔值
) 是一种用于数据交换的简单临时数据格式。
PostgreSQL 提供了许多选项来生成和导入 CSV
格式的数据,使用(顾名思义)逗号分隔记录值(尽管可以使用其他分隔符/定界符)。
psql
psql 的 \copy
命令可以处理 CSV
文件。
从 PostgreSQL 12 开始,psql 可以使用 \pset format csv
或命令行 --csv
选项生成 CSV
格式的输出。
COPY
SQL 命令 COPY 可以导入和导出 CSV
文件,但仅限于访问 PostgreSQL 系统用户可访问的文件。
file_fdw
file_fdw 外部数据包装器 基于 COPY 命令的基础功能构建,使服务器本地文件系统上的 CSV
文件能够被视为表。
CSV日志输出格式
PostgreSQL 可以选择生成 CSV格式的日志文件,如果 csvlog
值包含在 log_destination
参数中。
示例
使用以下虚构的示例数据集
postgres=# CREATE TABLE csvdemo (id INT, val1 TEXT, val2 TEXT); CREATE TABLE postgres=# INSERT INTO csvdemo VALUES (1,'foo','bar'), (2,'baz','boo,zoo'); INSERT 0 2 postgres=# SELECT * FROM csvdemo; id | val1 | val2
----+------+---------
1 | foo | bar
2 | baz | boo,zoo (2 rows)
使用psql
postgres=# \pset format csv Output format is csv. postgres=# SELECT * FROM csvdemo; id,val1,val2
1,foo,bar
2,baz,"boo,zoo"
或者,从系统命令行直接执行
psql -d postgres -U postgres --csv -c "SELECT * FROM csvdemo" id,val1,val2
1,foo,bar
2,baz,"boo,zoo"
使用 \copy
postgres=# \copy (SELECT * FROM csvdemo) to '/tmp/psql-copy.csv' (FORMAT 'csv', HEADER 'TRUE') COPY 2 postgres $ cat /tmp/psql-copy.csv
id,val1,val2 1,foo,bar 2,baz,"boo,zoo"
使用COPY
示例来自 psql 内部,但适用于任何应用程序。
postgres=# COPY (SELECT * FROM csvdemo) to '/tmp/copy.csv' (FORMAT 'csv', HEADER 'TRUE'); COPY 2 postgres $ cat /tmp/copy.csv
id,val1,val2 1,foo,bar 2,baz,"boo,zoo" postgres $ echo '3,zoo,"fizz,buzz"' >> /tmp/copy.csv postgres=# COPY csvdemo FROM '/tmp/foo.csv' (FORMAT 'csv') WHERE id=3; COPY 1 postgres=# SELECT * FROM csvdemo; id | val1 | val2 ----+------+----------- 1 | foo | bar 2 | baz | boo,zoo 3 | zoo | fizz,buzz (3 rows)
(注意:COPY ... WHERE
可用于 PostgreSQL 12)
使用file_fdw
扩展 file_fdw
必须在 PostgreSQL 服务器上可用。
postgres=# CREATE EXTENSION file_fdw; CREATE EXTENSION postgres=# CREATE SERVER file_fdw_csv_test FOREIGN DATA WRAPPER file_fdw; CREATE SERVER postgres=# CREATE FOREIGN TABLE csv_test ( id INT, val1 TEXT, val2 TEXT ) SERVER file_fdw_csv_test OPTIONS ( filename '/tmp/copy.csv', format 'csv', header 'TRUE' ); postgres=# SELECT * FROM csv_test; id | val1 | val2 ----+------+----------- 1 | foo | bar 2 | baz | boo,zoo 3 | zoo | fizz,buzz (3 rows)
有用链接
- 相关 RFC: RFC 4180 - 逗号分隔值 (CSV) 文件的通用格式和 MIME 类型
- 维基百科: 逗号分隔值
- 如何在 PostgreSQL 中使用 CSV 文件导入和导出数据 - Amit Sharma / EnterpriseDB 于 2019 年 12 月发布的博文