[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 メーリングリストの案内