[pgsql-jp: 41487] Re: メタコマンド copy のファイルパスに変数を使いたい

Tomoaki Sato sato @ sraoss.co.jp
2013年 8月 15日 (木) 12:08:25 JST


佐藤です。

> 小栁と申します
> 
> psql のメタコマンド \copy についてお教え下さい。
> 
> \set FILE_PATH hoge.csv
> CREATE TEMPORARY TABLE hoge(id integer, name text);
> \copy hoge from :'FILE_PATH' with csv
> 
> といったような形で \copy のファイルパスに変数を使いたいのですが、'::
> No such file or directory'というエラーとなり、思うように動きません。
> 
> マニュアルには下記のような記載があり、変数の置換規則が適用されないよ
> うです。
> 'このコマンドの構文はCOPY SQLコマンドに似ています(詳細はこのコマンド
> の説明を参照してください)。このため、\copyコマンドには特別な解析規則
> が適用されていることに注意してください。特に、変数の置換規則やバック
> スラッシュエスケープは適用されません。'
> 何か代替する方法はありませんでしょうか。

シェルスクリプトで埋め込んで実行するのはどうですか。

#! /bin/bash
FILE_PATH=hoge.csv
psql <<EOF
CREATE TEMPORARY TABLE hoge(id integer, name text);
\copy hoge from $FILE_PATH with csv
EOF

どうしても psql だけでやりたいなら、\setenv で psql 変数を環境変数とし
て設定し、\! で外部コマンドとして psql を実行するというやり方もあります。
ただ、このやり方だと 1 つのトランザクションにはできないです。

\set FILE_PATH hoge.csv
CREATE TEMPORARY TABLE hoge(id integer, name text);
\setenv FILE_PATH :FILE_PATH
\! psql -c "\copy hoge from $FILE_PATH with csv"


----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan


pgsql-jp メーリングリストの案内