LoginSignup
9
15

More than 5 years have passed since last update.

複数のSQLファイルを、psqlコマンド一度に実行するWindowsバッチ(リリース用)

Last updated at Posted at 2018-03-24

前提

  • 社内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"符号化方式では等しくありません

参考サイト

9
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
15