2013-07-04 278 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控制檯使用:

\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 
+0

這值得讚揚 - 一個簡單的工作解決方案! –

+4

這應該減少upvotes,因爲它不回答這個問題? – Eevee

0

你想有一個大的CSV文件所有表中的數據?大概不是。您需要爲每個表或一個大文件分別提供可用CSV文件標題表示的信息。

單獨的文件

其他的答案顯示瞭如何創建單獨的文件爲每個表。您可以查詢數據庫,向您展示這樣的查詢中的所有表:

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

一個大文件

一個大文件與PostgreSQL的COPY命令使用可以pg_dump命令來創建CSV格式的所有表。輸出也將包含所有CREATE TABLE,CREATE FUNCTION等,但使用Python,Perl或類似語言,您可以輕鬆提取僅CSV數據。

31

我做了這個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/ 
+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> 
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;