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.
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/
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
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;
COPY tablename TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;
schau dir das an
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>
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.
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.