前提
- 社内Webシステム
- PostgreSQL9.6
- Windows Server 2012
背景
リリース時に実行するSQLファイルが、以下のように複数あります。
実行するSQLファイルの一覧
A関係のテーブルを更新.sql
B関係のテーブルを更新.sql
VIEWを更新.sql
functionを更新.sql
今までは、pgAdminのクエリツールで1個ずつ実行していました。
しかし、これには以下の問題があります。
- 実行するSQLファイルが漏れるかもしれない
- 実行するSQLファイルの順番を間違えるかもしれない
対策
Windowsバッチで、複数のSQLファイルを一度に実行できるようにしました。psqlコマンドを使います。
execute_sqlfile.bat
@ECHO OFF
REM データベースの接続先を設定
SET PGHOST=localhost
SET PGPORT=5432
SET PGDATABASE=sample
SET PGUSER=postgres
REM このバッチファイルが存在するフォルダに移動する
PUSHD %~DP0
REM sqlファイルを実行。標準出力、標準エラー出力をファイルに出力する。
(TYPE ^
A関係のテーブルを更新.sql ^
B関係のテーブルを更新.sql ^
VIEWを更新.sql ^
functionを更新.sql ^
| psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
POPD
-
TYPE
コマンドで、複数のSQLファイルを1個にまとめている -
--single-transaction
: 一つでもエラーがあればロールバックさせる -
> %~DP0\psql_log.txt 2>&1
: batファイルと同じフォルダに、標準出力と標準エラー出力の結果をファイルに出力。正しく実行されたことの確認に使う。
【注意】パイプ|
の前にはスペースが必要
以下のようにパイプの前にスペースがないと、「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」というエラーが出ます。
これに約15分ハマりました。
execute_sqlfile.batの一部
| psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
【注意】SQLファイルの文字コードがBOM付きUTF-8だとエラーが出る
以下のようなSQLファイルを実行すると、「"COMMENT"またはその近辺で構文エラー」というエラーが出ました。
test.sql
COMMENT ON TABLE address IS 'サンプル';
execute_sqlfile.batの一部(BOM付きUTF-8)
REM エラー確認のためtest.sqlを2回実行する
(TYPE ^
test.sql ^
test.sql ^
| psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
psql_log.txt
COMMENT ON TABLE address IS 'サンプル';
ERROR: "COMMENT"またはその近辺で構文エラー
以下のように実行するBOM付きSQLファイルが1個のときは、エラーが出ませんでした。
execute_sqlfile.batの一部(BOM付きUTF-8)
REM エラー確認のためtest.sqlを2回実行する
(TYPE ^
test.sql ^
| psql --single-transaction --echo-all ) > %~DP0\psql_log.txt 2>&1
ファイルの途中にBOMがあると、エラーになるみたいです。
また、psqlコマンドに--file
オプションでBOM付きUTF-8のSQLファイルを渡したときも、エラーが出ました。
psql --file=test.sql
console
ERROR: 符号化方式"SJIS"における0xef 0xbbバイトシーケンスを持つ文字は"UTF8"符号化方式では等しくありません