シェルスクリプトからSQLを実行する際に引数を渡す方法をご紹介します。
環境
環境はDockerを使って検証しています。
docker
├ PostgreSQL 10.1
└ bash 4.4.12
下記のテーブルは存在している前提です。
CREATE TABLE IF NOT EXISTS test
(
id INTEGER,
username VARCHAR(30),
age INTEGRE
);
手順
数値を渡す場合
シェルスクリプトでは、-vオプションをつけて、「SQLの変数名=数値」または「SQLの変数名=bashの変数」としてSQL実行コマンドに加えます。
init-db.sh
psql -U user -d database < "/docker-entrypoint-initdb.d/insert-example.sql" -v num=1
実行されるSQLでは、「:変数」として値を受け取ります。
insert-example.sql
INSERT INTO test VALUES(1, 'Taro', :num);
文字列を渡す場合
シェルスクリプトでは、同様に-vオプションをつけて、「SQLの変数名="文字列"」または「SQLの変数名="bashの変数"」としてSQL実行コマンドに加えます。
init-db.sh
psql -U user -d database < "/docker-entrypoint-initdb.d/insert-example.sql" -v string="test"
実行されるSQLでは、「:変数」として値を受け取ります。
insert-example.sql
INSERT INTO test VALUES(1, :string, 1);