Was ist der einfachste Weg, um PL / pgSQL-Ausgaben aus einer PostgreSQL-Datenbank in einer CSV-Datei zu speichern?
Ich verwende PostgreSQL 8.4 mit pgAdmin III und dem PSQL-Plugin, von dem aus ich Abfragen ausführe.
Was ist der einfachste Weg, um PL / pgSQL-Ausgaben aus einer PostgreSQL-Datenbank in einer CSV-Datei zu speichern?
Ich verwende PostgreSQL 8.4 mit pgAdmin III und dem PSQL-Plugin, von dem aus ich Abfragen ausführe.
Antworten:
Möchten Sie die resultierende Datei auf dem Server oder auf dem Client?
Serverseite
Wenn Sie etwas einfach wiederverwenden oder automatisieren möchten, können Sie den integrierten COPY- Befehl von Postgresql verwenden . z.B
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.
Client-Seite
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 verwendetCOPY
, jedoch im Client ausgeführt wird:Beachten Sie, dass keine Beendigung erfolgt
;
, da Meta-Befehle im Gegensatz zu SQL-Befehlen durch Zeilenumbrüche beendet werden.Aus den Dokumenten :
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 einfachpg_copy_from
undpg_copy_to
Funktionen , die zu / von einem PHP - Array zu kopieren, die nicht für große Datenmengen effizient sein können.quelle
\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 impsql
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:
1
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 erhalten2 postgres
copy
BefehlCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 psql interaktiv (oder nicht)
Alle von ihnen können in Skripten verwendet werden, aber ich bevorzuge # 1.
4 pgadmin, aber das ist nicht skriptfähig.
quelle
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
','
:2) Setzen Sie das Ausgabeformat nicht ausgerichtet:
3) Nur Tupel anzeigen:
4) Ausgang einstellen:
5) Führen Sie Ihre Abfrage aus:
6) Ausgabe:
Sie können dann Ihre CSV-Datei an diesem Speicherort finden:
Kopieren Sie es mit dem
scp
Befehl oder bearbeiten Sie es mit nano:quelle
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
Das ist ein bisschen einfacher als
die nach meinem besten Wissen gleichwertig sind.
quelle
CSV Export Unification
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:Denken Sie nur an einen Befehl!
Es ist großartig für die Verwendung über ssh:
Es ist großartig für den Einsatz in Docker über SSH:
Auf dem lokalen Computer ist es sogar großartig:
Oder im Docker auf dem lokalen Computer?:
Oder auf einem Kubernetes-Cluster im Docker über HTTPS ??:
So vielseitig, viele Kommas!
Hast du überhaupt?
Ja, hier sind meine Notizen:
Die Kopien
Durch die
/copy
effektivepsql
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ührtpsql
werden.COPY
Führt Dateivorgänge auf dem Server aus, während das Benutzerkonto des Backend-Prozesses (Standardpostgres
), Dateipfade und Berechtigungen überprüft und entsprechend angewendet werden. Bei Verwendung werdenTO 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ührenpsql
. In ähnlicher Weise ist es bei großen ImportenCOPY
wahrscheinlich die leistungsstärkste Option , die Quelldatei auf den Server zu verschieben und zu verwenden .PSQL-Parameter
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:
Andere Werkzeuge
Nein, ich möchte nur CSV von meinem Server entfernen, ohne ein Tool zu kompilieren und / oder zu installieren.
quelle
Ich musste \ COPY verwenden, weil ich die Fehlermeldung erhalten habe:
Also habe ich verwendet:
und es funktioniert
quelle
psql
kann dies für Sie tun:Siehe
man psql
Hilfe zu den hier verwendeten Optionen.quelle
Neue Version - psql 12 - wird unterstützt
--csv
.Verwendungszweck:
quelle
Ich arbeite an AWS Redshift, das die Funktion nicht unterstützt
COPY TO
.Mein BI-Tool unterstützt jedoch tabulatorgetrennte CSVs, daher habe ich Folgendes verwendet:
quelle
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.
quelle
Ich habe verschiedene Dinge ausprobiert, aber nur wenige konnten mir die gewünschte CSV mit Header-Details geben.
Hier ist, was für mich funktioniert hat.
quelle
Ich habe ein kleines Tool namens geschrieben
psql2csv
, das dasCOPY query TO STDOUT
Muster kapselt und zu einer korrekten CSV führt. Die Benutzeroberfläche ähneltpsql
.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:
quelle
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:
quelle
-F","
anstatt-F";"
eine CSV-Datei zu generieren, die in MS Excel korrekt geöffnet werden würdeVerwenden Sie diesen Befehl, um eine CSV-Datei mit Spaltennamen als HEADER herunterzuladen:
quelle
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!
quelle
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.
quelle
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?
quelle
quelle