web-dev-qa-db-ja.com

\ copyを使用する場合のpsqlの変数置換

私はpsqlコマンド\ copyを使用していますが、クエリのスクリプトを作成するときに行ったように、シェルから(テーブル名の)変数をシェルに渡したいのですが。私は読んだ psqlのドキュメントで それ:

コマンドの構文は、SQL COPYコマンドの構文に似ています。このため、\ copyコマンドには特別な解析ルールが適用されます。特に、変数置換ルールとバックスラッシュエスケープは適用されません。

これは非常に決定的なようですが、誰かが回避策を知っているのでしょうか?

8
beacon_bonanza

コマンド全体をpsqlにパイプすることで、この制限を回避できます。

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb
4

備考:私はこの問題を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
2
mlt