2016-07-04 6 views
0

からCSVへのCOPYでの引用符の扱い:私は、コマンドシェルからこのCOPYクエリを実行しようとしていますコマンドシェル

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

ここで最も簡単な解決策は、ドキュメントを使用することです(IMHO)。また、これは(ほとんど)すべてのあなたの引用の問題を解決します:

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

UNIX(-oid)シェルを仮定します。

私はあなたのSQLコマンド内の文字列リテラルのためにドル引用符を示唆here document@wildplasser providedようにあなたが使用できない場合。周囲の一重引用符を二重引用符で置き換えると、$,`(backquote)、および\という特殊文字が含まれていると、副作用を伴う可能性のあるシェル内でvariable expansionが有効になります。

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

シェルで一括引用符(一重引用符)を使用すると、文字列はそのまま渡されます。文字は特別な意味を持ちません。

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は、サーバのファイルに対して同じ処理を行います。クライアントとサーバーが同じインストールで実行されている場合は、いずれかを使用できます。しかし、特定の違いが適用されます。どの "コマンドシェル"、重要な欠落詳細

関連する問題