it-swarm.com.de

Datenbank in CSV-Datei exportieren

Ich möchte eine Datenbank in eine CSV-Datei exportieren. Ist das möglich?

Wenn es möglich ist, wie kann ich das mit PostgreSQL tun? Ich habe gesehen, dass wir eine bestimmte Tabelle in eine CSV-Datei konvertieren können, aber ich kenne keine vollständige Datenbank.

27
Anand Singh

Ich habe diese pl/pgsql-Funktion erstellt, um eine .csv-Datei pro Tabelle zu erstellen (ohne Ansichten, dank @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;

Und ich benutze es so:

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

Sie können dies an der Psql-Konsole verwenden:

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

Oder es in der bash Konsole:

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

Modifizierte jlldoras brillante Antwort durch Hinzufügen einer Zeile, um zu verhindern, dass das Skript versucht, Ansichten zu kopieren:

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;
12
tarikki
COPY tablename TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;

schau dir das an

6
Tombeau

Wenn Sie beim Exportieren die Datenbank und den Benutzer angeben möchten, können Sie die von Piotr gegebene Antwort wie folgt ändern

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

Möchten Sie eine große CSV-Datei mit Daten aus allen Tabellen?

Wahrscheinlich nicht. Sie möchten separate Dateien für jede Tabelle oder eine große Datei mit mehr Informationen, die im CSV-Dateiheader ausgedrückt werden können.

Separate Dateien

Weitere Antworten zeigen, wie für jede Tabelle separate Dateien erstellt werden. Sie können eine Datenbank abfragen, um Ihnen alle Tabellen mit einer solchen Abfrage anzuzeigen:

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

Eine große Datei

Eine große Datei mit allen Tabellen im CSV-Format, die vom PostgreSQL-Befehl COPY verwendet werden, kann mit dem Befehl pg_dump erstellt werden. Die Ausgabe enthält auch alle CREATE TABLE, CREATE FUNCTION usw., aber mit Python, Perl oder einer ähnlichen Sprache können Sie einfach nur CSV-Daten extrahieren.

0
Michał Niklas

Ich habe eine Kopie von RazorSQL heruntergeladen, den Datenbankserver geöffnet, mit der rechten Maustaste auf die Datenbank geklickt und Export Tables ausgewählt. Dadurch erhielt ich die Option CSV, Excel, SQL usw.

0
Robs