はじめに
PostgreSQLのSQLを一括実行するバッチファイルについて書き残しておこうと思います。
環境変数でパスを通しているのにバッチ実行するとpsqlコマンドを認識してくれなかったり、エンコード関係でエラーが出たりしたので、その解決策も含めたバッチになっています。
人によってはその部分は不要かも。
環境
・Windows10
・PostgreSQL 16.2
起こった問題
接続情報と実行したいSQLが置いてあるファイルのパスを指定したごく普通のバッチファイルを作成したところ、以下のような2つのエラーに遭遇しました。
psqlコマンドが認識されない
環境変数の設定でパスを通せばコマンドは認識されるはずなのですが、何故かバッチのときだけ認識されませんでした。
'psql' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません' ``
これに関しては最後まで原因は分かりませんでしたので、cd
でインストールパスまで移動することでゴリ押し解決しました。
エンコーディング関係のエラー
SQLのエンコーディングとクライアント側のエンコーディングが合ってないために発生するエラーです。
自分の場合、クライアントがSJIS
でSQLがUTF-8
だった為に発生しました。
invalid byte sequence for encoding "SJIS": 0x80 0xe5
set PGCLIENTENCODING=UTF8
で一時的にエンコーディングを変更することで対応しました。
自分のデータベースのエンコード値が分からない場合はpsqlにログインして以下のコマンドを打つと確認できます。
postgres=# SHOW client_encoding;
解決策を盛り込んだ最終的なバッチ
以上のエラーを回避する策を盛り込んだバッチがコチラ!!
クリックするかコマンドプロンプト上にポイと投げ込んで実行しましょう。
文字化けする場合はバッチの文字コードをANSIに変更するといいです。
@echo off
REM ==================== 初期設定 ====================
REM PostgreSQL.exeのインストールパス
set PGPATH=C:\Program Files\PostgreSQL\16\bin
REM 接続情報
set HOST=localhost
set PORT=5432
set USER_ID=SUDARE
set DB_NAME=postgres
set PGPASSWORD=SUDARE
REM 実行したいSQLがあるファイルのパス
set SQLPATH=C:\SQL_OKIBA\
REM エンコードを一時変更
set PGCLIENTENCODING=UTF8
REM ==================== 実行開始 ====================
cd %PGPATH%
echo %PGPATH%に移動
echo %SQLPATH%の.sqlを実行
echo PGCLIENTENCODING=%PGCLIENTENCODING%に一時的に変更
for %%i in ("%SQLPATH%*.sql") do (
echo %%i を実行
psql -h %HOST% -p %PORT% -U %USER_ID% -d %DB_NAME% -f %%i
)
echo 処理終了
cmd /k
ちなみに、エラーがあっても最後まで突き進みます。
参考資料