私はpsqlコマンド\ copyを使用していますが、クエリのスクリプトを作成するときに行ったように、シェルから(テーブル名の)変数をシェルに渡したいのですが。私は読んだ psqlのドキュメントで それ:
コマンドの構文は、SQL COPYコマンドの構文に似ています。このため、\ copyコマンドには特別な解析ルールが適用されます。特に、変数置換ルールとバックスラッシュエスケープは適用されません。
これは非常に決定的なようですが、誰かが回避策を知っているのでしょうか?
コマンド全体をpsqlにパイプすることで、この制限を回避できます。
echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb
備考:私はこの問題をMS Windowsで自分で偶然見つけましたが、そのstdinを使用してpsqlにフィードするものをすでに持っていました。入力を組み合わせる必要がありました。そして、それはそれが本当にトリッキーになる場所です。私の意見の例では、アーウィンの回答の他に、ある程度価値があると考えたので、他の誰かも\copy
で「変数を使用」してstdinにデータを入力する必要がある場合に備えて、ここに回答として投稿しますWindowsプラットフォーム。
Stdinから一部のデータをコピーし、同時に\copy
に「変数」を使用する場合は、括弧がエスケープされて事態が複雑になる可能性があります。以下はその方法の例です。注意 トリプル(シック!)キャレットエスケープ 括弧でスコープする列名
@echo off
set TBL=wd
(
echo truncate %TBL%;
echo \copy %TBL% (depth,path,name,created,accessed,modified,size^^^) from stdin csv
C:\msys64\usr\bin\find ^
"e:/somepath" ^
-type f -printf "%%d,\"%%h\",\"%%f\",\"%%t\",\"%%a\",\"%%c\",%%s\n"
) | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h some.server -U user dbname