Wenn deine Daten schon auf dem Server liegen, kannst du den Befehl COPY nutzen, um sie in PostgreSQL-Tabellen zu laden. Das ist besonders praktisch, wenn du mit großen Datenmengen arbeitest oder dein PostgreSQL-Server auf einer eigenen Maschine läuft.
Der COPY-Befehl, der serverseitig ausgeführt wird, ist im echten Projektalltag besonders bequem. Erstens läuft er viel schneller, weil die Dateien schon auf dem Server sind und nicht übers Netzwerk geschickt werden müssen. Das macht den Prozess auch sicherer: Die Daten müssen nicht vom lokalen Rechner kopiert werden, was das Risiko von Leaks verringert. Außerdem kannst du das Laden easy in automatisierte Server-Skripte oder Hintergrunddienste einbauen – zum Beispiel, wenn analytische Tabellen regelmäßig aktualisiert werden.
Syntax vom COPY-Befehl
Der COPY-Befehl ist simpel, aber es gibt ein paar wichtige Punkte, auf die du achten solltest:
COPY table_name
FROM '/path/to/file.csv'
WITH (FORMAT CSV, HEADER TRUE);
table_name– der Name der Tabelle, in die du die Daten laden willst./path/to/file.csv– der komplette Pfad zur Datei auf dem Server.- Mit den
WITH-Optionen kannst du das Dateiformat, Header, Trennzeichen und vieles mehr angeben.
Beispiel für die Verwendung von COPY
Schauen wir uns ein kleines Beispiel an. Angenommen, du willst eine CSV-Datei mit Studentendaten in deine PostgreSQL-Datenbank laden. Die Datei liegt auf dem Server unter /var/lib/postgresql/data/students.csv.
Schritt 1. Tabelle für die Daten
Erstmal checken wir, ob es in der Datenbank eine Tabelle gibt, in die wir die Daten laden können:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
registration_date DATE
);
In dieser Tabelle werden die Studentendaten gespeichert: Name, Email und Registrierungsdatum.
Schritt 2. CSV-Datei
So könnte die Datei /var/lib/postgresql/data/students.csv aussehen:
id,name,email,registration_date
1,Alex Lin,alex.lin@example.com,2023-09-01
2,Maria Chi,maria.chi@example.com,2023-09-02
3,Peter Ming,peter.ming@example.com,2023-09-02
Schritt 3. COPY-Befehl
Jetzt können wir COPY nutzen, um die Daten aus der Datei in die Tabelle zu laden:
COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, HEADER TRUE);
Hier gilt:
FORMAT CSVsagt PostgreSQL, dass die Datei im CSV-Format ist.HEADER TRUEbedeutet, dass die erste Zeile der Datei die Spaltennamen enthält.
Nach dem Ausführen des Befehls sind die Daten aus der Datei in der students-Tabelle drin.
Ergebnis prüfen
Nach dem Laden der Daten solltest du checken, ob alles geklappt hat:
SELECT * FROM students;
Du siehst dann die Zeilen aus der Datei, die in deine Tabelle geladen wurden:
| id | name | registration_date | |
|---|---|---|---|
| 1 | Alex Lin | alex.lin@example.com | 2023-09-01 |
| 2 | Maria Chi | maria.chi@example.com | 2023-09-02 |
| 3 | Peter Ming | peter.ming@example.com | 2023-09-02 |
Zugriffsrechte einstellen
PostgreSQL muss Zugriff auf die Datei haben, um den COPY-Befehl zu nutzen. Wenn die Rechte nicht stimmen, bekommst du Fehler. Zum Beispiel:
ERROR: could not open file "/var/lib/postgresql/data/students.csv" for reading: Permission denied
Damit sowas nicht passiert, achte auf Folgendes:
- Die Datei muss für den PostgreSQL-User lesbar sein. Das ist meistens der User
postgres. - Check die Rechte der Datei und des Ordners, in dem sie liegt:
ls -l /var/lib/postgresql/data/students.csv
Wenn die Rechte nicht reichen, kannst du sie so ändern:
chmod 644 /var/lib/postgresql/data/students.csv
chown postgres:postgres /var/lib/postgresql/data/students.csv
Hier geht's um Linux. Die Rechte in Windows werden normalerweise vom Windows-Admin gesetzt und das ist nicht Teil unseres Kurses.
Einschränkungen vom COPY-Befehl
Beim Arbeiten mit COPY gibt's ein paar Besonderheiten, die du kennen solltest:
Pfad zur Datei: Gib immer den absoluten Pfad an, weil PostgreSQL relative Pfade oft nicht erkennt.
Datei-Encoding: Wenn die CSV-Datei ein anderes Encoding als die Datenbank hat (zum Beispiel Windows-1251 statt UTF-8), musst du das Encoding explizit angeben:
COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, ENCODING 'WIN1251', HEADER TRUE);
Fehlerhafte Dateistruktur: Wenn die Struktur der Datei nicht zur Tabellendefinition passt oder die Daten falsch sind (z.B. Text in ein Zahlenfeld geladen wird), gibt's einen Fehler. Check die Daten vorher!
Praktische Anwendung
Das Verwenden von COPY zum Laden von Daten vom Server hat viele Use Cases:
- Datenmigration: Du kannst große Datenmengen zwischen Servern oder Datenbanken verschieben.
- Integration mit externen Systemen: Viele Systeme exportieren Daten als CSV. Mit
COPYkannst du die easy in PostgreSQL laden. - Vorbereitung von Analyse-Reports: Automatisches Laden von Serverdaten beschleunigt die Analyse von großen Datenmengen.
Typische Fehler und wie du sie löst
Beim Arbeiten mit COPY können dir einige Fehler begegnen:
Problem: Datei nicht erreichbar
Fehlermeldung: could not open file for reading: Permission denied.
Lösung: Check, ob die Datei für den PostgreSQL-User (postgres) erreichbar ist, und prüfe die Rechte.
Problem: Falsches Dateiformat
Fehlermeldung: malformed CSV line.
Lösung: Schau nach, ob die Datei leere Zeilen, Datenfehler oder komische Zeichen enthält. Achte auch auf das richtige Trennzeichen.
Problem: Struktur passt nicht zu den Daten
Fehlermeldung: ERROR: invalid input syntax for type integer.
Lösung: Check, ob die Spalten in der Tabelle zur Struktur der Datei passen. Zahlen gehören in Zahlenspalten, Daten in DATE-Spalten usw.
Jetzt hast du alles am Start, um COPY effektiv zum Laden von Daten vom Server zu nutzen. Setz das in deinen Projekten ein, um Zeit zu sparen und deine Arbeit mit Datenbanken produktiver zu machen.
GO TO FULL VERSION