Postgres: \kopieren Sie die syntax-Fehler in .sql-Datei
Ich versuche, ein Skript zu schreiben, dass Kopien von Daten aus einer Kreuztabellenabfrage ein .csv-Datei in Postgres 8.4. Ich bin in der Lage, führen Sie den Befehl in der psql-Kommandozeile, aber wenn ich den Befehl in eine Datei und führen Sie es über die -f
option, bekomme ich einen syntax-Fehler.
Hier ist ein Beispiel was ich schaue (aus diese tolle Antwort):
CREATE TEMP TABLE t (
section text
,status text
,ct integer
);
INSERT INTO t VALUES
('A', 'Active', 1), ('A', 'Inactive', 2)
,('B', 'Active', 4), ('B', 'Inactive', 5)
, ('C', 'Inactive', 7);
\copy (
SELECT * FROM crosstab(
'SELECT section, status, ct
FROM t
ORDER BY 1,2'
,$$VALUES ('Active'::text), ('Inactive')$$)
AS ct ("Section" text, "Active" int, "Inactive" int)
) TO 'test.csv' HEADER CSV
Ich dann dies und das folgende syntax-Fehler:
$ psql [system specific] -f copy_test.sql
CREATE TABLE
INSERT 0 5
psql:copy_test.sql:12: \copy: parse error at end of line
psql:copy_test.sql:19: ERROR: syntax error at or near ")"
LINE 7: ) TO 'test.csv' HEADER CSV
^
Einer ähnlichen übung zu tun, nur eine einfache Abfrage ohne Kreuztabelle funktioniert ohne Zwischenfälle.
Was die Ursache der syntax Fehler, und wie kann ich kopieren Sie diese Tabelle, um eine csv-Datei mit Skript-Datei?
- Sie sind in der Lage zu laufen, dass
\copy
ist von derpsql
Befehlszeile? - Richtig. Gerade copy-paste funktioniert es.
- Für kichert versuchen Sie, alle Zeilenumbrüche aus der
\copy
Befehl in Ihre Datei und sehen, was passiert. - Ok, also es scheint ein problem mit den Zeilenumbrüchen. Es funktioniert, wenn es gibt keine newline-Zeichen, aber alle Zeilenumbrüche erstellen Sie einen syntax Fehler bei der schließenden Klammer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als mit diese Antwort, erstellen Sie ein multi-line
VIEW
mit einem single-line\copy
Befehl, z.B.:psql
denkt dein Erster Befehl ist nur\copy (
und die folgenden Zeilen, die von anderen nicht verwandten-Anweisung. Meta-Befehle sind nicht verteilt auf mehrere Zeilen, da Zeilenvorschub ist, wird ein terminator für Sie.Relevanten Auszüge aus psql-Handbuchseite mit einigen Hervorhebungen Hinzugefügt:
Also der erste Fehler ist, dass
\copy (
Versagen, dann die folgenden Zeilen werden interpretiert als eine unabhängige WÄHLEN, die gut aussieht, bis Zeile 7, wenn es eine falsche schließende Klammer.Wie gesagt, in den Kommentaren, der zu beheben wäre, Stopfen die ganze meta-Befehl in einer einzigen Zeile.
Entsprechend der
psql
Dokumentation:Wäre dies einer der Fälle, wo die
-f
option behandelt Ihre Eingabe unterschiedlich von der Befehlszeile aus. Entfernen von Zeilenumbrüchen gearbeitet, das umleiten der original-Dateipsql
's stdin hätte wahrscheinlich auch funktioniert.Den Antworten hier aufgelistet erklären die Argumentation ganz deutlich. Hier ist eine kleine Kerbe, die Ihnen erlaubt, Ihre sql enthält mehrere Zeilen und die Arbeit mit psql.