2016-07-04 5 views
0

Ich versuche, diese COPY-Abfrage aus dem Kommando-Shell auszuführen:Anführungszeichen in COPY CSV von Kommando-Shell Handhabung

COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER; 

Ich weiß, dass Sie Abfragen von der Kommandozeile mit psql ausführen können:

psql -U username -d mydatabase -c 'SELECT * FROM mytable' 

Aber wie kann ich die 2 kombinieren? Das Folgende scheint nicht zu funktionieren, aber ich bin mir nicht sicher, wie/wenn ich fliehen muss.

psql -U username -d mydatabase -c 'COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;' 
+0

Welche "Kommando-Shell", wichtiges fehlendes Detail. –

Antwort

2

nicht mischen, ' und ", Zitat Abfrage mit ".

psql -U username -d mydatabase -c "COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;" 
2

Einfachste Lösung ist (IMHO), ein here-documant zu verwenden. Dies löst auch (fast) alle zitieren Probleme:

#!bin/sh 
psql -U username -d mydatabase <<OMG 
    COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER; 
OMG 
2

Unter der Annahme einer UNIX (-oid) Shell.

Wenn Sie kein here document wie @wildplasser provided schlage ich Dollar-Angebote für Stringliterale innerhalb SQL-Befehl verwenden können. Das Ersetzen der umgebenden einfachen Anführungszeichen durch doppelte Anführungszeichen würde variable expansion in der Shell aktivieren, was bei Verwendung von Sonderzeichen unter Umständen zu Nebeneffekten führen kann: $, ` (zurück) und \.

Bei voller Anführungszeichen in der Shell (einfache Anführungszeichen) wird die Zeichenfolge übergeben, wie es ist, keine besondere Bedeutung für ein beliebiges Zeichen.

Wenn Sonderzeichen in der SQL-Zeichenfolge ausgeschlossen werden können oder ordnungsgemäß verarbeitet werden, ist @ferhat's simple solution in Ordnung.

Oder können Sie jedes Apostroph (') innerhalb ersetzen die vollständig zitierte Zeichenfolge mit '\'' - die effektiv die Zeichenfolge in Anführungszeichen endet, hängt eine wörtliche ' und startet eine neue vollständige Zitat.

psql -U username -d mydatabase -c 'COPY products_273 TO '\''/tmp/products_199.csv'\'' DELIMITER '\'','\'' CSV HEADER;' 

Verwandte:

Oder setzen den SQL-Befehl in einer separaten Datei (ohne Anführungszeichen umgeben) und verwenden psql -f:

psql -U username -d mydatabase -f /path/to/myfile.sql 

Ich nehme an, Sie sind sich der Unterschied zwischen \copy (der psql Meta-Befehl) und COPY (der SQL-Befehl).\copy liest und schreibt Dateien lokal in den Client, während COPY das gleiche für Dateien auf dem Server tut. Wenn Client und Server auf derselben Installation ausgeführt werden, können Sie beides verwenden. Gewisse Unterschiede treffen jedoch zu.