CodeGym /Kurse /SQL SELF /Verwendung von COPY zum Laden von Daten vom...

Verwendung von COPY zum Laden von Daten vom Server

SQL SELF
Level 23 , Lektion 4
Verfügbar

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 CSV sagt PostgreSQL, dass die Datei im CSV-Format ist.
  • HEADER TRUE bedeutet, 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 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

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:

  1. Die Datei muss für den PostgreSQL-User lesbar sein. Das ist meistens der User postgres.
  2. 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 COPY kannst 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.

1
Umfrage/Quiz
Datenimport aus CSV, Level 23, Lektion 4
Nicht verfügbar
Datenimport aus CSV
Datenimport aus CSV
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION