2013-07-04 31 views
18

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

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

答えて

6
COPY tablename TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER; 

チェックこのアウト

+3

どこから 'products_273'を取得したのですか?あなたは[この回答](http://stackoverflow.com/a/1120390/704015)から直接コピーし貼り付けましたか?クールではありません。そして、この答えをあきらめた人たちには恥ずべきものです。 –

+1

別の質問への回答からのコピー/貼り付けで何が問題になっていますか?私はこれが特に良い答えだとは思わない。なぜなら、データベースではなく単一のテーブルにしか適用されないからだ。 –

+0

@CarlG問題は参考にされています。あなたは他人の仕事から栄光を得てはなりません...コピー/貼り付けの代わりに、あなたは質問にコメントを追加して、あなたが助けてくれると思われる答えにリンクすることができます(そして、ここで回答がうまく収まらない場合でも、質問を重複してマークすることができます) – Random

34

あなたはpsqlのコンソールでこれを使用することができます。

bashのコンソールで
\copy (SELECT foo,bar FROM whatever) TO '/tmp/file.csv' DELIMITER ',' CSV HEADER 

それとも:

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "SELECT foo,bar FROM whatever" > output_file 
+0

これはより多くのupvotesに値する - 簡単で実用的な解決策! –

+4

質問に答えることができないので、これはより少ないupvotesに値するでしょうか? – Eevee

0

あなたが持つ一つの大きなCSVファイルをしたいですかすべてのテーブルのデータ?

おそらくそうではありません。テーブルごとに別々のファイルまたは1つの大きなファイルを必要とし、CSVファイルヘッダーで表現できる情報が増えます。

別々のファイル

他の回答には、各テーブルに別々のファイルを作成する方法を示しています。あなたはあなたに、このようなクエリですべてのテーブルを表示するには、データベースを照会することができますpg_dumpコマンドで作成することができますPostgreSQLのCOPYコマンドで使用されるCSV形式ですべてのテーブルと

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

一つの大きなファイル

一つの大きなファイルを。出力にはCREATE TABLE,CREATE FUNCTIONなどがありますが、Python、Perlなどの言語を使用すると、CSVデータのみを簡単に抽出できます。

31

私は(ビュー、@tarikkiのおかげ除く)テーブルあたり1つの.csvファイルを作成するために、このにPL/pgSQL関数を作った:

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/ 
+1

この正確な解決策を望んでいますが、書き込みに "/home/user/Documents/public.activities.csv"ファイルを開くことができませんでした。許可が拒否されました –

+0

ユーザーにそのパスに書き込む権限がないことが明らかです。スクリプトを実行しているユーザーが所有する別のパスを試してください。 – jllodra

+0

@ArihantGodhaは 'COPY'を' \ COPY'に変更しようとしました – dayer4b

0

エクスポート中にデータベースとユーザーを指定する場合、次のようにPiotrの答えを変更することができます。

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "select * from tableName" > tableName_exp.csv -U <USER> -d <DB_NAME> 
ビューをコピーしようとしているからスクリプトを防ぐために、1行を追加することによって、
7

修正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; 
関連する問題