42

我想将 Postgres 数据库导出为 CSV 文件。这可能吗?

如果有可能,那我该怎么做?我已经看到我们可以将特定表转换为 CSV 文件,但我不知道整个数据库。

4

7 回答 7

63

我制作了这个 pl/pgsql 函数来为每个表创建一个 .csv 文件(不包括视图,感谢@tarikki):

CREATE OR REPLACE FUNCTION db_to_csv(path TEXT) RETURNS void AS $$
declare
   tables RECORD;
   statement TEXT;
begin
FOR tables IN 
   SELECT (table_schema || '.' || table_name) AS schema_table
   FROM information_schema.tables t INNER JOIN information_schema.schemata s 
   ON s.schema_name = t.table_schema 
   WHERE t.table_schema NOT IN ('pg_catalog', 'information_schema')
   AND t.table_type NOT IN ('VIEW')
   ORDER BY schema_table
LOOP
   statement := 'COPY ' || tables.schema_table || ' TO ''' || path || '/' || tables.schema_table || '.csv' ||''' DELIMITER '';'' CSV HEADER';
   EXECUTE statement;
END LOOP;
return;  
end;
$$ LANGUAGE plpgsql;

我这样使用它:

SELECT db_to_csv('/home/user/dir');
-- this will create one csv file per table, in /home/user/dir/
于 2013-11-18T20:10:43.993 回答
52

您可以在 psql 控制台上使用它:

\copy (SELECT foo,bar FROM whatever) TO '/tmp/file.csv' DELIMITER ',' CSV HEADER

或者在 bash 控制台中:

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "SELECT foo,bar FROM whatever" > output_file
于 2013-07-04T06:33:37.470 回答
18

通过添加一行以防止脚本尝试复制视图,修改了 jlldoras 出色的答案:

CREATE OR REPLACE FUNCTION db_to_csv(path TEXT) RETURNS void AS $$
declare
   tables RECORD;
   statement TEXT;
begin
FOR tables IN 
   SELECT (table_schema || '.' || table_name) AS schema_table
   FROM information_schema.tables t INNER JOIN information_schema.schemata s 
   ON s.schema_name = t.table_schema 
   WHERE t.table_schema NOT IN ('pg_catalog', 'information_schema', 'configuration')
   AND t.table_type NOT IN ('VIEW')
   ORDER BY schema_table
LOOP
   statement := 'COPY ' || tables.schema_table || ' TO ''' || path || '/' || tables.schema_table || '.csv' ||''' DELIMITER '';'' CSV HEADER';
   EXECUTE statement;
END LOOP;
return;  
end;
$$ LANGUAGE plpgsql;
于 2016-05-13T12:58:53.520 回答
5
COPY tablename TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;

看一下这个

于 2013-07-04T06:32:28.357 回答
5

如果要在导出时指定数据库和用户,只需修改 Piotr 给出的答案,如下所示

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "select * from tableName" > tableName_exp.csv -U <USER> -d <DB_NAME>
于 2015-05-28T16:44:56.043 回答
0

您想要一个包含所有表数据的大 CSV 文件吗?

可能不是。您希望每个表或一个大文件都有单独的文件,其中包含可以在 CSV 文件标题中表示的更多信息。

单独的文件

其他答案显示了如何为每个表创建单独的文件。您可以查询数据库以向您显示具有此类查询的所有表:

SELECT DISTINCT table_name
FROM information_schema.columns
WHERE table_schema='public'
AND position('_' in table_name) <> 1
ORDER BY 1

一个大文件

COPY可以使用命令创建一个包含 PostgreSQL 命令使用的所有 CSV 格式的表的大文件pg_dump。输出也会有 allCREATE TABLECREATE FUNCTION,但使用 Python、Perl 或类似语言,您可以轻松地仅提取 CSV 数据。

于 2013-07-04T08:00:27.567 回答
0

我下载了RazorSQL的副本,打开数据库服务器并右键单击数据库并选择导出表,它为我提供了 CSV、EXCEL、SQL 等选项...

于 2018-07-17T15:48:27.240 回答