【PostgreSQL】psql コマンドでファイル実行した際に引数を渡すには

■ はじめに

AWS Redshift を psql コマンドでファイル実行しようと思っていて
その際に、Hive の変数(以下の関連記事を参照)のように渡したい。

https://dk521123.hatenablog.com/entry/2021/06/24/094254

その第一段階として、Redshiftの元となっている PostgreSQL で
色々と試してみた。

目次

【1】方法
【2】使用上の注意
 1)引数が複数ある場合、それぞれに「-v」を付加する
 2)データ側が数字以外の場合、囲い文字を意識する
【3】サンプル
 例1:受け取った値をINSERTする
 例2:受け取った値を連結したテーブル名をSELECTする

【1】方法

* psql 側は、「-v <変数名>="<値>"」で渡す
* ファイル側は、「:<変数名>」で受け取る

【2】使用上の注意

1)引数が複数ある場合、それぞれに「-v」を付加する
2)データ側が数字以外の場合、囲い文字を意識する

1)引数が複数ある場合、それぞれに「-v」を付加する

引数が複数ある場合、
~~~~~~~~~~~
... -v val1="XXX" -v val2="YYY" -v val3="ZZZ"
~~~~~~~~~~~
みたいな感じで、それぞれに「-v」を付加する

2)データ側が数字以外の場合、囲い文字を意識する

以下のように、囲み文字「'」を呼び出し側で付加しておく
~~~~~~~~~~~
... -v val1="'XXX'" -v val2="'YYY'" -v val3="'ZZZ'"
~~~~~~~~~~~

ちなみに、ファイルの方に事前に、囲み文字を付加させた場合、
文字列として扱われてしまうので、呼び出し側でハンドリングする必要がある

sample.sql

INSERT INTO users VALUES(:val1, ':val2', ':val3');

/*
-- 出力結果:エラー --
ERROR:  "timestamp"型の入力構文が不正です: ":val3"
行 1: INSERT INTO users VALUES(31, ':val2', ':val3');
*/

【3】サンプル

* 実行環境は、Windows の コマンドプロンプトで実行した

使用するテーブル

CREATE TABLE IF NOT EXISTS "users" (
    "user_id" INTEGER NOT NULL,
    "user_name" VARCHAR(50) NOT NULL,
    "created_at" TIMESTAMP NULL DEFAULT 'CURRENT_TIMESTAMP',
    PRIMARY KEY ("user_id")
);

例1:受け取った値をINSERTする

psql -U postgres -d sample_db -h localhost -f "C:\temp\sample.sql" -v val1="30" -v val2="'Kevin'" -v val3="'2021-08-02 16:40:55.175736'"

sample.sql

-- val1 - val3 を受け取る
INSERT INTO users VALUES(:val1, :val2, :val3);

例2:受け取った値を連結したテーブル名をSELECTする

psql -U postgres -d sample_db -h localhost -f "C:\temp\sample2.sql" -v val1="us" -v val2="er" -v val3="s"

sample2.sql

-- val1 - val3 を受け取り、テーブル名「users」にする
SELECT * FROM :val1:val2:val3;

 user_id | user_name |         created_at
---------+-----------+----------------------------
・・・略・・・
      30 | Kevin     | 2021-08-02 16:40:55.175736
(XX 行)

関連記事

ファイルからSQL文を一括で実行するには ~pdqlコマンドの利用~
https://dk521123.hatenablog.com/entry/2014/09/11/002003
psql で 変数 / 定数を使う
https://dk521123.hatenablog.com/entry/2020/01/23/223756
よく使う pdqlコマンド
https://dk521123.hatenablog.com/entry/2020/01/10/224818
psqlでパスワードを省略する
https://dk521123.hatenablog.com/entry/2020/03/06/000000