記事一覧

Windows向け PostgreSQL でSQLスクリプトを実行する

 

  
目次     



  

PostgreSQLでSQLスクリプトを実行する

ハロー、みなさん。エジソンです。 

今回は、PostgreSQLにおいて、SQLが書かれたスクリプトファイルを実行する方法を備忘録として残しておくことにします。

PostgreSQL 9.6 で検証しました。


SQLスクリプトファイルを実行してみる

ファイルが存在する場所・保存する先は、「C:\Users\username\Desktop」としています。

リスト1:postgres.sqlを保存
select tablename from pg_tables;

リスト1には、実行したいSQLを保存しましょう。select でも良いですし、insert などでもOKです。


リスト2:postgres.batを保存
@echo off

REM PostgreSQLのbinディレクトリ
set PGPATH=C:\Program Files\PostgreSQL\9.6\bin\

REM 接続先情報
set HOST=127.0.0.1
set PORT=5432
set USER_ID=postgres
set DB_NAME=postgres

REM スクリプト実行
"%PGPATH%psql" -h %HOST% -p %PORT% -U %USER_ID% -d %DB_NAME% -f postgres.sql


リスト2は、PostgreSQLと対話するためのプログラムである、psql の実行バッチになります。スクリプトファイルを実行するには、 -f オプションを用い、実行したいファイルを指定しましょう。


リスト3:実行例
C:\Users\username\Desktop>postgres.bat
ユーザ postgres のパスワード:
        tablename
-------------------------
 pg_statistic
 pg_type
 pg_authid
 pg_user_mapping
 pg_attribute
 pg_proc
…

リスト3は実行例です。postgres.bat を実行すると、パスワードの入力が求められます。認証が通ると、スクリプトファイルに書かれたSQLが実行されます。


SQLをまとめて実行

任意のディレクトリに配置しているスクリプトファイルをまとめて実行してみましょう。




このテクニックは、システム開発時にテーブルやデータの初期化スクリプトをまとめて実行したいような場合に役立ちます。開発途中における、DBのスキーマやマスタデータの追加は、往々にしてあるものです。


リスト4-1:scriptディレクトリにs1.sqlを保存
select tablename from pg_tables limit 1;

リスト4-2:scriptディレクトリにs2.sqlを保存
select schemaname from pg_tables limit 1;

リスト4-1と4-2に書かれたSQLに特別意味はありません。ここでは、スクリプトファイルを2つ用意したかったので、何かしらの select 文を書いてみました。


リスト5:postgres_loop.batを保存
@echo off

REM PostgreSQLのインストールパスのbinディレクトリ
set PGPATH=C:\Program Files\PostgreSQL\9.6\bin\

REM 接続先情報
set HOST=127.0.0.1
set PORT=5432
set USER_ID=postgres
set DB_NAME=postgres
set PGPASSWORD=password

set curpath=%~dp0

for %%i in ("%curpath%script\*.sql") do (
	REM スクリプト実行
	"%PGPATH%psql" -h %HOST% -p %PORT% -U %USER_ID% -d %DB_NAME% -f %%i
)

リスト5は、リスト2を少々修正したものです。forループを使用して scriptディレクトリ 以下の拡張子が sql のファイルを順次実行します。もう一つリスト2と違うのは、PGPASSWORDという変数を宣言していることです。

この変数にパスワードを入力しておくことで、スクリプト実行時にパスワードの入力を省略することができます。これが無いと、スクリプト実行のたびにパスワードの入力が求められるため、必須のテクニックと言えるでしょう。


リスト6:実行例
C:\Users\username\Desktop>postgres_loop.bat
tablename
--------------
 pg_statistic
(1 行)


 schemaname
------------
 pg_catalog
(1 行)

リスト6実行結果です。実行結果を見ると分かるように、複数のスクリプトファイルに書かれたSQLが実行されています。


環境依存情報は別のバッチファイルにまとめよう

プログラムを書く際の基本とも言えることですが、環境に依存する情報は別のファイルに定義しておくのがベターです。

本エントリにおける環境依存情報は、psql のファイルパスと、DB接続情報などです。
以下のように書くとよいかと思います。

リスト7:env.batを保存
@echo off

REM PostgreSQLのインストールパスのbinディレクトリ
set PGPATH=C:\Program Files\PostgreSQL\9.6\bin\

REM 接続先情報
set HOST=127.0.0.1
set PORT=5432
set USER_ID=postgres
set DB_NAME=postgres
set PGPASSWORD=password

リスト8:env.batの呼び出し
@echo off

set curpath=%~dp0

call %curpath%env.bat 

REM env.batで宣言した変数を読み取ることができる
"%PGPATH%psql" -h %HOST% -p %PORT% -U %USER_ID% -d %DB_NAME% -f 


まとめ

psql.exe -h [ホスト名] -p [ポート番号] -U [ユーザーID] -d [DB名] -f [スクリプトファイル]
パスワードを指定する場合は、set PGPASSWORD=[パスワード] で環境変数として宣言しましょう。
関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp

ezolab