2013-07-04 19 views
18

Desidero esportare un database in un file CSV. È possibile?Esporta database in file CSV

Se è possibile, come posso farlo utilizzando PostgreSQL? Ho visto che possiamo convertire una tabella specifica in un file CSV ma non conosco un intero database.

risposta

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

controllo questo fuori

+3

Dove hai preso 'products_273' da? Hai copiato e incollato direttamente da [questa risposta] (http://stackoverflow.com/a/1120390/704015), vero? Non fantastico E vergogna per quelli che hanno mandato in subbuglio questa risposta. –

+1

Cosa c'è di sbagliato nella copia/incolla dalla risposta ad un'altra domanda? Non penso che questa sia una risposta particolarmente buona, dal momento che si applica solo a un singolo tavolo piuttosto che a un database, ma se non ci si preoccupa di ripetere la tecnica, funzionerà. –

+0

@CarlG La questione è per i riferimenti, non si dovrebbe ottenere la gloria dal lavoro di qualcun altro ...Invece di copiare/incollare, puoi semplicemente aggiungere un commento alla domanda e collegarti alla risposta che hai visto dicendo che potrebbe essere d'aiuto (e quindi forse contrassegnare la domanda come duplicata, anche se qui la risposta non si adatta bene) – Random

34

È possibile utilizzare questo a console psql:

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

O in console bash:

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

Questo merita più upvotes: una soluzione semplice e funzionante! –

+4

Questo merita meno upvotes, dal momento che non risponde alla domanda? – Eevee

0

Vuoi un file grande CSV con dati da tutte le tabelle?

Probabilmente no. Vuoi i file separati per ogni tabella o un grande file con più informazioni che possono essere espresse nell'intestazione del file CSV.

file separati

altre risposte mostra come creare file separati per ogni tabella. È possibile eseguire una query di database visualizzare tutte le tabelle con tale query:

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

un unico grande file

Un file grandi con tutte le tabelle in formato CSV utilizzati da PostgreSQL COPY comando possono essere creati con pg_dump comando. L'output avrà anche tutti gli CREATE TABLE, CREATE FUNCTION ecc., Ma con Python, Perl o linguaggio simile è possibile estrarre facilmente solo i dati CSV.

31

ho fatto questa funzione PL/pgSQL per creare un unico file .csv per tabella (esclusi i punti di vista, grazie a @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; 

e lo uso in questo modo:

SELECT db_to_csv('/home/user/dir'); 
-- this will create one csv file per table, in /home/user/dir/ 
+1

Vuoi questa soluzione esatta ma non funziona per me non è stato possibile aprire il file "/home/user/Documents/public.activities.csv" per la scrittura: Autorizzazione negata –

+0

Sembra ovvio che l'utente non abbia il permesso di scrivere su quel percorso . Prova con un altro percorso di proprietà dell'utente che sta eseguendo lo script. – jllodra

+0

@ArihantGodha prova a cambiare 'COPY' in' \ COPY' – dayer4b

0

Se si desidera specificare il database e l'utente durante l'esportazione, è sufficiente modificare la risposta fornita da Piotr come segue

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "select * from tableName" > tableName_exp.csv -U <USER> -d <DB_NAME> 
risposta
7

jlldoras modificati brillante con l'aggiunta di una linea per evitare che lo script da cercando di copiare guardati:

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;