42

Postgres データベースを CSV ファイルにエクスポートしたいと考えています。これは可能ですか?

可能であれば、どうすればこれを行うことができますか? 特定のテーブルを CSV ファイルに変換できることは確認しましたが、データベース全体についてはわかりません。

4

7 に答える 7

63

この pl/pgsql 関数を作成して、テーブルごとに 1 つの .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

スクリプトがビューをコピーしようとするのを防ぐために 1 行を追加して、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

すべてのテーブルのデータを含む 1 つの大きな CSV ファイルが必要ですか?

おそらくそうではありません。テーブルごとに個別のファイルが必要な場合や、CSV ファイル ヘッダーで表現できる詳細情報を含む 1 つの大きなファイルが必要な場合があります。

別ファイル

他の回答は、テーブルごとに個別のファイルを作成する方法を示しています。データベースにクエリを実行して、そのようなクエリを使用してすべてのテーブルを表示できます。

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

1 つの大きなファイル

PostgreSQL コマンドで使用される CSV 形式のすべてのテーブルを含む 1 つの大きなファイルは、コマンドCOPYで作成できますpg_dump。出力には all なども含まれますがCREATE TABLECREATE FUNCTIONPython や Perl などの言語を使用すると、CSV データのみを簡単に抽出できます。

于 2013-07-04T08:00:27.567 に答える