CSV (逗号分隔值) 是一种简单的临时数据格式,用于数据交换。
PostgreSQL 提供了多种选项来生成和导入 CSV 格式的数据,正如其名称所示,使用逗号分隔记录值(尽管也可以使用其他分隔符)。
psql
psql 的 \copy 命令可以处理 CSV 文件。
从 PostgreSQL 12 开始,psql 可以使用 \pset format csv 或命令行 --csv 选项生成 CSV 格式的输出。
COPY
SQL 命令 COPY 可以导入和导出 CSV 文件,但只能与 PostgreSQL 系统用户可以访问的文件进行操作。
file_fdw
基于 COPY 命令底层功能构建的 file_fdw 外部数据包装器,允许将服务器本地文件系统上的 CSV 文件视为表。
CSV 日志输出格式
如果 log_destination 参数中包含 csvlog 的值,PostgreSQL 还可以选择性地生成 CSV 格式的日志文件。
示例
使用以下虚构的示例数据集
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
必须在 PostgreSQL 服务器上可用 file_fdw 扩展。
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 - Comma-Separated Values (CSV) Files 的通用格式和 MIME 类型
- 维基百科: 逗号分隔值
- 如何在 PostgreSQL 中使用 CSV 文件导入和导出数据 - Amit Sharma / EnterpriseDB 于 2019 年 12 月的博客文章
