Ich bin mir ziemlich sicher, dass jeder von uns schon einmal in einer Situation war, in der man einen Bericht erstellen und/oder einige Daten aus einer Datenbank extrahieren und in einem Tabellenblatt darstellen musste. In vielen Fällen bevorzugen unsere Kunden Excel für die Bearbeitung von Tabellenblättern/Berichten, weil es eben Excel ist.

Wie gehen Sie also an dieses Problem heran? Kopieren Sie Daten und fügen sie ein? Oder verwenden Sie eineRDBMS-GUI, um den Bericht in einer Tabellenkalkulation zu erstellen? Heute zeige ich Ihnen eine wirklich kleine, aber praktische Funktion von PostgreSQL -COPY.

Hallo COPY#

Aus der COPYDokumentation: „COPY verschiebt Daten zwischen PostgreSQL-Tabellen und Standard-Dateisystemdateien. COPY TO kopiert den Inhalt einer Tabelle in eine Datei, währendCOPY FROM Daten aus einer Datei in eine Tabelle kopiert (wobei die Daten an das angehängt werden, was sich bereits in der Tabelle befindet). COPY TO kann auch die Ergebnisse einer SELECT-Abfrage kopieren.“

Was macht COPY also:

  1. Es kann den Inhalt einer Datei (Daten) in eine Tabelle kopieren, oder
  2. Es kann den Inhalt einer Tabelle (oder ein SELECT-Abfrageergebnis) in eine Datei kopieren.

Wenn eine Liste von Spalten angegeben ist, kopiert COPY nur die Daten in den angegebenen Spalten in oder aus der Datei. Wenn es in der Tabelle Spalten gibt, die nicht in der Spaltenliste enthalten sind, fügt COPY FROM die Standardwerte für diese Spalten ein.

COPY mit einem Dateinamen weist den PostgreSQL-Server an, direkt aus einer Datei zu lesen oder in eine Datei zu schreiben. Die Datei muss für den Server zugänglich sein und der Name muss aus der Sicht des Servers angegeben werden. Wenn STDIN oder STDOUT angegeben wird, werden die Daten über die Verbindung zwischen dem Client und dem Server übertragen.

Klangt gut? Probieren wir es aus!

Haftungsausschluss: COPY kann Daten von/auf CSV- und Binärdateien lesen/schreiben. Obwohl ich sicher bin, dass es viele Anwendungsfälle für die Verwendung von Binärdateien gibt, werde ich mich in diesem Blogpost nur auf die Verwendung für CSV-Dateien konzentrieren, da diese für mich persönlich am praktischsten für die Weitergabe von Datensätzen sind.

COPY TO#

Wenn Sie aus einer SELECT-Abfrage eine CSV-Datei erstellen oder den gesamten Inhalt einer Tabelle in eine CSV-Datei auslagern möchten, können Sie den Befehl „COPY … TO …“ verwenden.

Verwendung einer SELECT-Abfrage#

Wenn Sie eine Ergebnismenge in eine CSV-Datei kopieren möchten, lautet das Format des COPY-Befehls:

1
COPY (<select-query-here>) TO <file-path>;

Oder, ein praxisbezogeneres Beispiel:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv';

Wie Sie sehen, verwenden wir den Befehl COPY, der die Ergebnisse in eine CSV-Datei auf dem lokalen Dateisystem kopiert. Sie können die Abfrage noch viel weiter ausbauen. Hier ein Beispiel für ein Projekt, an dem ich gerade arbeite:

1
COPY (SELECT price_rules.* FROM quotes LEFT JOIN price_rules ON quotes.id = price_rules.chargeable_id where quotes.id = 437) TO '~/Desktop/exports/price_rules.csv' CSV;

Wie Sie sehen, können Sie jede beliebige SELECT-Abfrage verwenden, die einen Datensatz als Ergebnis liefert. 🙂

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV HEADER;

Durch das Hinzufügen des Schlüsselworts HEADER am Ende werden die Kopfzeilen in die CSV-Datei aufgenommen, bei denen es sich um die Namen der Tabellenspalten handelt.

Ein weiteres wichtiges Merkmal von CSV-Dateien sind die Begrenzungszeichen. Je nachdem, welches Zeichen als Begrenzungszeichen in der CSV-Datei verwendet werden soll, können Sie das Zeichen im Befehl angeben:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV DELIMITER ',' HEADER;

Verwendung eines Tabellennamens#

Wenn Sie eine ganze Tabelle in eine CSV-Datei auslagern wollen, ist der Befehl wirklich einfacher. Sie müssen nur den Tabellennamen und die Zieldatei angeben:

1
COPY people TO '~/Desktop/people.csv' CSV DELIMITER ',' HEADER;

Das war’s.

COPY FROM#

Wenn Sie nun die Daten aus der CSV-Datei in eine Tabelle einfügen wollen, können Sie den Befehl „COPY &mldr; FROM &mldr;“ verwenden. Die Syntax ist sehr ähnlich, mit nur einem Unterschied:

1
COPY <table-name> FROM <file-path> DELIMITER ',' CSV HEADER;

Oder, um ein Beispiel aus der Praxis zu verwenden:

1
COPY addresses FROM '~/Desktop/addresses.csv' DELIMITER ',' CSV HEADER;

Outro#

COPY ist eine wirklich nette und coole Funktion von Postgres. Der Einfachheit halber habe ich versucht, diesen Blogpost kurz und einfach zu halten. Wenn Sie Fragen oder Anregungen haben, können Sie mir gerne einen Kommentar schreiben. Wenn Sie keine Lust zum Plaudern haben, können Sie auch die COPYDokumentation besuchen.

Hat Ihnen dieser Artikel gefallen? Abonnieren Sie meinen Newsletter und erhalten Sie meine neuen Beiträge in Ihrem Posteingang. Er ist kurz und bündig und wird monatlich an über 1.000 Abonnenten verschickt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.