2016-07-04 139 views
0

我試圖運行在命令行這個副本查詢處理中COPY引號CSV:從命令外殼

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

我知道你可以使用psql裏運行的命令行查詢:

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

但我怎樣才能結合2?下面似乎沒有工作,但我不知道如何/如果我需要逃脫。

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

其中 「命令外殼」,缺少重要細節。 –

回答

2

請勿混用'",報價查詢與"

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

最簡單的解決方案是(恕我直言)使用here-documant。這也將解決(幾乎)所有報價的問題:

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

假設UNIX(-oid)外殼。

如果here document@wildplasser provided我爲你的SQL命令中的字符串文字建議美元的報價則不能使用。用雙引號代替周圍的單引號會在shell中打開variable expansion,如果包含特殊字符,可能會產生副作用:$,`(反引號)和\

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

採用全報價在shell(單引號)的字符串傳遞的是,對於任何字符沒有特殊含義。

如果SQL字符串中的特殊字符可以排除或正確處理,@ferhat's simple solution將會很好。

或者可以更換每個單引號(')內完全引用字符串'\'' - 這有效地結束引用的字符串,附加文字',並開始一個新的全報價。

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

相關:

或者把SQL命令在一個單獨的文件(不包括周邊引號)並使用psql -f

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

我想大家都知道\copy(psql的元命令)和COPY(SQL命令)之間的差異。\copy讀取和寫入本地到客戶端的文件,而COPY服務器上的文件也是如此。如果客戶端和服務器在相同的安裝上運行,則可以使用其中一種。但是,某些差異適用。