Antworten:
Möchten Sie die resultierende Datei auf dem Server oder auf dem Client?
Wenn Sie etwas einfach wiederverwenden oder automatisieren möchten, können Sie den integrierten COPY- Befehl von Postgresql verwenden . z.B
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
Dieser Ansatz wird vollständig auf dem Remote-Server ausgeführt - er kann nicht auf Ihren lokalen PC schreiben. Es muss auch als Postgres "Superuser" (normalerweise "root" genannt) ausgeführt werden, da Postgres nicht verhindern kann, dass es mit dem lokalen Dateisystem dieses Computers böse Dinge tut.
Das bedeutet nicht, dass Sie als Superuser verbunden sein müssen (Automatisierung wäre ein Sicherheitsrisiko einer anderen Art), da Sie die SECURITY DEFINER
Option verwenden könnenCREATE FUNCTION
, um eine Funktion zu erstellen, die so ausgeführt wird, als wären Sie ein Superuser .
Der entscheidende Teil ist, dass Ihre Funktion dazu dient, zusätzliche Überprüfungen durchzuführen und nicht nur die Sicherheit zu umgehen. Sie können also eine Funktion schreiben, die genau die Daten exportiert, die Sie benötigen, oder Sie können etwas schreiben, das verschiedene Optionen akzeptiert, solange diese vorhanden sind Treffen Sie eine strenge Whitelist. Sie müssen zwei Dinge überprüfen:
GRANT
s in der Datenbank definiert, aber die Funktion wird jetzt als Superuser ausgeführt, sodass Tabellen, die normalerweise "außerhalb der Grenzen" liegen, vollständig zugänglich sind. Sie möchten wahrscheinlich nicht, dass jemand Ihre Funktion aufruft und Zeilen am Ende Ihrer "Benutzer" -Tabelle hinzufügt ...Ich habe einen Blog-Beitrag geschrieben, der diesen Ansatz erweitert und einige Beispiele für Funktionen enthält, mit denen Dateien und Tabellen unter strengen Bedingungen exportiert (oder importiert) werden.
Der andere Ansatz besteht darin , die Dateiverwaltung auf der Clientseite durchzuführen , dh in Ihrer Anwendung oder Ihrem Skript. Der Postgres-Server muss nicht wissen, in welche Datei Sie kopieren, er spuckt nur die Daten aus und der Client legt sie irgendwo ab.
Die zugrunde liegende Syntax hierfür ist der COPY TO STDOUT
Befehl, und grafische Tools wie pgAdmin werden ihn für Sie in einen schönen Dialog einschließen.
Der psql
Befehlszeilen-Client verfügt über einen speziellen "Meta-Befehl" \copy
, der dieselben Optionen wie der "echte" Befehl verwendet COPY
, jedoch im Client ausgeführt wird:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
Beachten Sie, dass keine Beendigung erfolgt ;
, da Meta-Befehle im Gegensatz zu SQL-Befehlen durch Zeilenumbrüche beendet werden.
Aus den Dokumenten :
Verwechseln Sie COPY nicht mit der psql-Anweisung \ copy. \ copy ruft COPY FROM STDIN oder COPY TO STDOUT auf und ruft die Daten in einer Datei ab, auf die der psql-Client zugreifen kann. Daher hängen der Dateizugriff und die Zugriffsrechte eher vom Client als vom Server ab, wenn \ copy verwendet wird.
Ihre Anwendungsprogrammiersprache unterstützt möglicherweise auch das Pushen oder Abrufen der Daten, Sie können jedoch im Allgemeinen COPY FROM STDIN
/ TO STDOUT
innerhalb einer Standard-SQL-Anweisung nicht verwenden, da es keine Möglichkeit gibt, den Eingabe- / Ausgabestream zu verbinden. PHP PostgreSQL - Handler ( nicht PDO) enthalten sehr einfach pg_copy_from
und pg_copy_to
Funktionen , die zu / von einem PHP - Array zu kopieren, die nicht für große Datenmengen effizient sein können.
\copy
funktioniert auch - dort sind die Pfade relativ zum Client und es wird kein Semikolon benötigt / erlaubt. Siehe meine Bearbeitung.
\copy
müsste es ein Einzeiler sein. Sie haben also nicht die Schönheit, die SQL so zu formatieren, wie Sie es möchten, und nur eine Kopie / Funktion darum zu legen.
\copy
handelt es sich um einen speziellen Meta-Befehl im psql
Befehlszeilen-Client . Bei anderen Clients wie pgAdmin funktioniert dies nicht. Sie werden wahrscheinlich ihre eigenen Werkzeuge haben, wie z. B. grafische Assistenten, um diese Aufgabe zu erledigen.
Es gibt verschiedene Lösungen:
psql
Befehlpsql -d dbname -t -A -F"," -c "select * from users" > output.csv
Dies hat den großen Vorteil , dass man es über SSH verwenden , kann, wie ssh postgres@host command
- hier können Sie erhalten
copy
BefehlCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
Alle von ihnen können in Skripten verwendet werden, aber ich bevorzuge # 1.
Stellen Sie im Terminal (während Sie mit der Datenbank verbunden sind) die Ausgabe in die CVS-Datei ein
1) Stellen Sie den Feldtrenner auf ','
:
\f ','
2) Setzen Sie das Ausgabeformat nicht ausgerichtet:
\a
3) Nur Tupel anzeigen:
\t
4) Ausgang einstellen:
\o '/tmp/yourOutputFile.csv'
5) Führen Sie Ihre Abfrage aus:
:select * from YOUR_TABLE
6) Ausgabe:
\o
Sie können dann Ihre CSV-Datei an diesem Speicherort finden:
cd /tmp
Kopieren Sie es mit dem scp
Befehl oder bearbeiten Sie es mit nano:
nano /tmp/yourOutputFile.csv
COPY
oder \copy
Ansätze werden korrekt behandelt (in Standard-CSV-Format konvertieren). macht dies?
Wenn Sie an allen Spalten einer bestimmten Tabelle zusammen mit Überschriften interessiert sind , können Sie verwenden
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
Das ist ein bisschen einfacher als
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
die nach meinem besten Wissen gleichwertig sind.
Diese Informationen sind nicht wirklich gut vertreten. Da dies das zweite Mal ist, dass ich dies ableiten muss, werde ich dies hier einfügen, um mich daran zu erinnern, wenn nichts anderes.
Der beste Weg, dies zu tun (CSV aus Postgres herauszuholen), ist die Verwendung des COPY ... TO STDOUT
Befehls. Sie möchten es jedoch nicht so machen, wie es in den Antworten hier gezeigt wird. Die korrekte Verwendung des Befehls ist:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
Es ist großartig für die Verwendung über ssh:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
Es ist großartig für den Einsatz in Docker über SSH:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
Auf dem lokalen Computer ist es sogar großartig:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
Oder im Docker auf dem lokalen Computer?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
Oder auf einem Kubernetes-Cluster im Docker über HTTPS ??:
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
So vielseitig, viele Kommas!
Ja, hier sind meine Notizen:
Durch die /copy
effektive psql
Ausführung werden Dateivorgänge auf jedem System ausgeführt, auf dem der Befehl ausgeführt wird, als der Benutzer, der ihn ausführt 1 . Wenn Sie eine Verbindung zu einem Remoteserver herstellen, ist es einfach, Datendateien auf dem System zu kopieren, die auf dem Remoteserver ausgeführt psql
werden.
COPY
Führt Dateivorgänge auf dem Server aus, während das Benutzerkonto des Backend-Prozesses (Standard postgres
), Dateipfade und Berechtigungen überprüft und entsprechend angewendet werden. Bei Verwendung werden TO STDOUT
dann die Dateiberechtigungsprüfungen umgangen.
Beide Optionen erfordern eine anschließende Dateiverschiebung, wenn psql
nicht auf dem System ausgeführt werden, auf dem sich die resultierende CSV letztendlich befinden soll. Dies ist meiner Erfahrung nach der wahrscheinlichste Fall, wenn Sie hauptsächlich mit Remote-Servern arbeiten.
Es ist komplexer, so etwas wie einen TCP / IP-Tunnel über ssh zu einem Remote-System für eine einfache CSV-Ausgabe zu konfigurieren, aber für andere Ausgabeformate (binär) ist es möglicherweise besser, /copy
über eine Tunnelverbindung eine lokale Verbindung auszuführen psql
. In ähnlicher Weise ist es bei großen Importen COPY
wahrscheinlich die leistungsstärkste Option , die Quelldatei auf den Server zu verschieben und zu verwenden .
Mit psql-Parametern können Sie die Ausgabe wie CSV formatieren, aber es gibt auch Nachteile, wenn Sie daran denken müssen, den Pager zu deaktivieren und keine Header zu erhalten:
$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,
3,Truck,1,2017-10-02,,t,,0,,
4,Truck,2,2017-10-02,,t,,0,,
Nein, ich möchte nur CSV von meinem Server entfernen, ohne ein Tool zu kompilieren und / oder zu installieren.
psql
kann dies für Sie tun:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
Siehe man psql
Hilfe zu den hier verwendeten Optionen.
Neue Version - psql 12 - wird unterstützt --csv
.
--csv
Schaltet in den CSV-Ausgabemodus (Comma-Separated Values) um. Dies entspricht dem CSV-Format \ pset .
csv_fieldsep
Gibt das Feldtrennzeichen an, das im CSV-Ausgabeformat verwendet werden soll. Wenn das Trennzeichen im Wert eines Felds angezeigt wird, wird dieses Feld in doppelten Anführungszeichen gemäß den Standard-CSV-Regeln ausgegeben. Der Standardwert ist ein Komma.
Verwendungszweck:
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^' postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres > output.csv
In pgAdmin III gibt es eine Option zum Exportieren in eine Datei aus dem Abfragefenster. Im Hauptmenü ist es Abfrage -> In Datei ausführen oder es gibt eine Schaltfläche, die dasselbe tut (es ist ein grünes Dreieck mit einer blauen Diskette im Gegensatz zu dem einfachen grünen Dreieck, das nur die Abfrage ausführt). Wenn Sie die Abfrage nicht über das Abfragefenster ausführen, würde ich das tun, was IMSoP vorgeschlagen hat, und den Befehl copy verwenden.
Ich habe ein kleines Tool namens geschrieben psql2csv
, das das COPY query TO STDOUT
Muster kapselt und zu einer korrekten CSV führt. Die Benutzeroberfläche ähnelt psql
.
psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY
Es wird angenommen, dass die Abfrage der Inhalt von STDIN (falls vorhanden) oder das letzte Argument ist. Alle anderen Argumente mit Ausnahme der folgenden werden an psql weitergeleitet:
-h, --help show help, then exit
--encoding=ENCODING use a different encoding than UTF8 (Excel likes LATIN1)
--no-header do not output a header
Wenn Sie eine längere Abfrage haben und psql verwenden möchten, fügen Sie Ihre Abfrage in eine Datei ein und verwenden Sie den folgenden Befehl:
psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
-F","
anstatt -F";"
eine CSV-Datei zu generieren, die in MS Excel korrekt geöffnet werden würde
Ich kann DataGrip , eine Datenbank-IDE von JetBrains, nur empfehlen . Sie können eine SQL-Abfrage in eine CSV-Datei exportieren und das SSH-Tunneling problemlos einrichten. Wenn sich die Dokumentation auf "Ergebnismenge" bezieht, bedeutet dies das Ergebnis, das von einer SQL-Abfrage in der Konsole zurückgegeben wird.
Ich bin nicht mit DataGrip verbunden, ich liebe das Produkt einfach!
JackDB , ein Datenbank-Client in Ihrem Webbrowser, macht dies wirklich einfach. Besonders wenn du auf Heroku bist.
Sie können eine Verbindung zu entfernten Datenbanken herstellen und SQL-Abfragen auf diesen ausführen.
Quelle
(Quelle: jackdb.com )
Sobald Ihre Datenbank verbunden ist, können Sie eine Abfrage ausführen und nach CSV oder TXT exportieren (siehe unten rechts).
Hinweis: Ich bin in keiner Weise mit JackDB verbunden. Ich nutze derzeit ihre kostenlosen Dienste und denke, dass es ein großartiges Produkt ist.
Auf Anfrage von @ skeller88 poste ich meinen Kommentar erneut als Antwort, damit er nicht von Leuten verloren geht, die nicht jede Antwort lesen ...
Das Problem mit DataGrip ist, dass es Ihre Brieftasche in den Griff bekommt. Es ist nicht kostenlos. Probieren Sie die Community Edition von DBeaver unter dbeaver.io aus. Es ist ein plattformübergreifendes Datenbank-Tool von FOSS für SQL-Programmierer, Datenbankadministratoren und Analysten, das alle gängigen Datenbanken unterstützt: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto usw.
Mit DBeaver Community Edition ist es einfach, eine Verbindung zu einer Datenbank herzustellen, Abfragen zum Abrufen von Daten auszugeben und dann die Ergebnismenge herunterzuladen, um sie in CSV, JSON, SQL oder anderen gängigen Datenformaten zu speichern. Es ist ein brauchbarer FOSS-Konkurrent von TOAD für Postgres, TOAD für SQL Server oder Toad für Oracle.
Ich bin nicht mit DBeaver verbunden. Ich mag den Preis und die Funktionalität, aber ich wünschte, sie würden die DBeaver / Eclipse-Anwendung mehr öffnen und es einfacher machen, DBeaver / Eclipse Analyse-Widgets hinzuzufügen, anstatt die Benutzer für das Jahresabonnement bezahlen zu müssen, um Grafiken und Diagramme direkt darin zu erstellen die Anwendung. Meine Java-Codierungsfähigkeiten sind verrostet und ich möchte keine Wochen brauchen, um neu zu lernen, wie man Eclipse-Widgets erstellt, nur um festzustellen, dass DBeaver die Möglichkeit deaktiviert hat, Widgets von Drittanbietern zur DBeaver Community Edition hinzuzufügen.
Haben DBeaver-Benutzer Einblick in die Schritte zum Erstellen von Analyse-Widgets, die der Community Edition von DBeaver hinzugefügt werden sollen?
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """
cursor.execute(qry)
rows = cursor.fetchall()
value = json.dumps(rows)
with open("/home/asha/Desktop/Income_output.json","w+") as f:
f.write(value)
print 'Saved to File Successfully'