我想将一个Postgres数据库导出为CSV文件,这是可能的吗?
如果可以的话,那么我该如何操作呢?我已经看到我们可以将特定的表转换成CSV文件,但是我不知道怎样才能处理整个数据库。
我想将一个Postgres数据库导出为CSV文件,这是可能的吗?
如果可以的话,那么我该如何操作呢?我已经看到我们可以将特定的表转换成CSV文件,但是我不知道怎样才能处理整个数据库。
我创建了这个pl/pgsql函数来为每个表(不包括视图,感谢@tarikki)创建一个csv文件:
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/
您可以在 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
在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;
psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "select * from tableName" > tableName_exp.csv -U <USER> -d <DB_NAME>
SELECT DISTINCT table_name
FROM information_schema.columns
WHERE table_schema='public'
AND position('_' in table_name) <> 1
ORDER BY 1
一个大文件
可以使用pg_dump
命令创建一个包含所有表格以CSV格式存储的大文件,该文件可用于PostgreSQL的COPY
命令。输出还将包括所有的CREATE TABLE
、CREATE FUNCTION
等内容,但是使用Python、Perl或类似语言,您可以轻松提取只有CSV数据。
information_schema.tables
和information_schema.schemata
的数据库权限。还要检查您是否有创建和执行存储过程的权限。还要仔细检查运行postgresql的系统用户(通常在*nix系统上为postgres
)是否可以写入目标目录。-啊,抱歉,刚刚看到您已经解决了。太好了。如果您不想使用/tmp
,您也可以chmod
或chown
另一个文件夹。:) - jllodra