0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PostgreSQL】バッチファイルでフォルダ内のSQLを一括実行する

Last updated at Posted at 2025-02-09

はじめに

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にログインして以下のコマンドを打つと確認できます。

client_encodingの値確認
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

ちなみに、エラーがあっても最後まで突き進みます。

参考資料

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?