PostgreSQL-Import CSV-Datei verursacht Syntaxfehler

8

Ich versuche, eine CSV-Datei über den Befehl "COPY" in eine Datenbank zu importieren. Ich erhalte jedoch den (was häufig vorkommt) Fehler, dass ich ein Superuser sein muss und stattdessen "\ copy" verwenden sollte. Bei Verwendung von \ copy wird jedoch ein Syntaxfehler angezeigt:

ERROR:  syntax error at or near "\"
LINE 1: \copy

Das Caret zeigt auf "\". Hier ist meine Frage:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

Ich habe sowohl "copy" als auch "\ copy" ausprobiert. Der erste gibt mir einen Superuser-Fehler, der zweite gibt mir diesen Syntaxfehler. Irgendeine Idee, wie man das Problem behebt? Bring es zum Laufen?

Ich führe den Befehl über das SQL-Eingabefeld von myPgAdmin aus.

Die einzige andere Frage, die ich habe, betrifft den Import der Spalten über Tabellennamen (Spalte2, Spalte3 usw.). Ist das die richtige Syntax dafür?

Antjanus
quelle

Antworten:

8

\copyist ein psql- Befehl (Befehlszeilenbefehl). Es ist kein regulärer SQL-Befehl.

Sie müssen stattdessen COPY verwenden (dafür muss die Datei jedoch auf dem Datenbankserver vorhanden sein).

ein Pferd ohne Name
quelle
Wie würden Sie CSV-Dateien direkt über SQL importieren, anstatt eine Befehlszeile zu verwenden?
Antjanus
1
@antjanus: Sie würden den Befehl COPY verwenden, wie ich erwähnt habe (und Adam ausführlich erklärt hat)
a_horse_with_no_name
Auch dies erfordert Superuser-Berechtigungen und ist nicht sicher, oder?
Antjanus
4

Informationen zum KOPIEREN finden Sie im Postgres- Handbuch .

In pgAdmin (oder der SQL-Zeichenfolge, die Sie über ein Skript oder eine andere Datenbankverbindung übergeben) würden Sie nur COPY ohne das Präfix "\" verwenden.

Geben Sie also etwas ein wie: COPY tablename....

Sie müssen sicherstellen, dass Sie über die entsprechenden Berechtigungen zum Ausführen des Befehls verfügen. In diesem Fall müssen Sie sich in der Datenbank anmelden und Schreibzugriff auf 'Tabellenname' haben. Postgres muss auch in der Lage sein, auf die Datei zuzugreifen, damit auf dem Datenbankserver auf den Pfad / home / uploads / zugegriffen werden kann und der Benutzer von postgres die Datei lesen kann - überprüfen Sie die Berechtigungen für die Datei und das Verzeichnis.

Adam f
quelle
2

Auf meinem 9.1-System ist der Fehler, den ich bekomme, ziemlich informativ:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Wenn Sie den Hinweis noch einmal sorgfältig lesen, können Sie ihn von stdin kopieren. Dies ist, was \ copy in psql im Backend tatsächlich tut. Weitere Informationen finden Sie in den Dokumenten unter http://www.postgresql.org/docs/8.3/static/sql-copy.html .

Sie könnten dann den Textkörper der Kopie in Ihre Abfrage einfügen, oder zumindest funktioniert dies in psql so.

Chris Travers
quelle
1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

So mache ich das in pgAdmin3. Aber überprüfen Sie die Benutzerrechte sorgfältig, manchmal sind die Rechte das Problem. (Benutzer postgres auf filename.txt / chmod 777)

Martin
quelle
Sie müssen ein DB-Superuser sein, um dies zu tun, obwohl daher die ursprüngliche Beschwerde.
Chris Travers
0

Eine andere Methode besteht darin, eine Ansicht für die SQL-Abfrage zu erstellen. Verwenden Sie dann den Befehl \ copy.

NinjaLoop
quelle
2
Eine größere Darstellung wäre am hilfreichsten.
Michael Green
Wie hilft eine Ansicht beim Importieren von Daten?
a_horse_with_no_name