【PostgreSQL】バッチファイルからSQLファイルを読み込んで実行する【BAT】

BAT,CODE,PostgreSQL,データベース

バッチファイルを実行しSQLファイルを読み込んでSQLを実行する書き方です。

実行方法 ①バッチからSQLファイルを実行し、結果を外部ファイルに出力する
②バッチからSQLファイルを実行し、結果をCSV形式で出力する
③外部ファイルの出力先をSQLファイルに記述する

各種設定

データベース設定

データベース名:postgres
テーブル名:test_table
ユーザー名:postgres

テーブル設定

こちらで作成したものを使用します:【SQL】サンプルテーブルを作成するSQL

通常のSQL実行結果

select * from test_table where category = 'dessert';

【実行結果】category = 'dessert'の4レコードが選択されます。

         menu          | category | price | cal 
-----------------------+----------+-------+-----
 Milk chocolate mousse | dessert  |   390 | 335
 Stick shoe custard    | dessert  |   250 | 257
 Stick shoe chocolate  | dessert  |   250 | 263
 Baked cheese cake     | dessert  |   410 | 335
(4 行)

①バッチからSQLファイルを実行し、結果を外部ファイルに出力する

バッチファイル概要

  • -f  オプションで実行するSQLファイルを指定します
  • -o オプションで外部ファイルの出力先を指定します
@echo off
rem --------------------------------------------------
rem DB接続パラメータ
rem --------------------------------------------------
set PGPATH=C:\"Program Files"\PostgreSQL\10\bin\
set HOSTNAME=localhost
set PORTNUM=5432
set DBNAME=postgres
set USERNAME=postgres
set PGPASSWORD=postgres

rem --------------------------------------------------
rem bat実行パラメータ
rem --------------------------------------------------
set SQLFILE=input.sql
set LOGFILE=result.log

rem --------------------------------------------------
rem SQL実行
rem --------------------------------------------------
%PGPATH%psql -h %HOSTNAME% -p %PORTNUM% -d %DBNAME% -U %USERNAME% -f %SQLFILE% -o %LOGFILE%

input.sqlの内容

select * from test_table where category = 'dessert';

【実行結果】result.logに該当の4レコードが出力されました。

         menu          | category | price | cal 
-----------------------+----------+-------+-----
 Milk chocolate mousse | dessert  |   390 | 335
 Stick shoe custard    | dessert  |   250 | 257
 Stick shoe chocolate  | dessert  |   250 | 263
 Baked cheese cake     | dessert  |   410 | 335
(4 行)

②バッチからSQLファイルを実行し、結果をCSV形式で出力する

バッチファイル概要

  • 出力先はバッチファイルで指定します
  • 出力形式はSQLファイルで指定します
@echo off
rem --------------------------------------------------
rem DB接続パラメータ
rem --------------------------------------------------
set PGPATH=C:\"Program Files"\PostgreSQL\10\bin\
set HOSTNAME=localhost
set PORTNUM=5432
set DBNAME=postgres
set USERNAME=postgres
set PGPASSWORD=postgres

rem --------------------------------------------------
rem bat実行パラメータ
rem --------------------------------------------------
set SQLFILE=input.sql
set CSVFILE=result.csv

rem --------------------------------------------------
rem SQL実行
rem --------------------------------------------------
%PGPATH%psql -h %HOSTNAME% -p %PORTNUM% -d %DBNAME% -U %USERNAME% -f %SQLFILE% -o %CSVFILE%

input.sqlの内容

  • SQLを copy ()to stdout with csv delimiter ',' ; の中に記述します
  • ()内に記述するselect文の末尾に「;」は不要です
  • このSQLファイルでは 出力先を標準出力にする・nullを空白にする・ヘッダを出力する を指定しています
copy (
    select * from test_table where category = 'dessert'
) to stdout with csv delimiter ',' null as '' header;

【実行結果】result.csvにヘッダと該当の4レコードがcsv形式で出力されます。

menu,category,price,cal
Milk chocolate mousse,dessert,390,335
Stick shoe custard,dessert,250,257
Stick shoe chocolate,dessert,250,263
Baked cheese cake,dessert,410,335

③外部ファイルの出力先をSQLファイルに記述する

バッチファイル概要

  • バッチファイルには出力先の記述をせず input.sql で出力先を指定します
@echo off
rem --------------------------------------------------
rem DB接続パラメータ
rem --------------------------------------------------
set PGPATH=C:\"Program Files"\PostgreSQL\10\bin\
set HOSTNAME=localhost
set PORTNUM=5432
set DBNAME=postgres
set USERNAME=postgres
set PGPASSWORD=postgres

rem --------------------------------------------------
rem bat実行パラメータ
rem --------------------------------------------------
set SQLFILE=input.sql

rem --------------------------------------------------
rem SQL実行
rem --------------------------------------------------
%PGPATH%psql -h %HOSTNAME% -p %PORTNUM% -d %DBNAME% -U %USERNAME% -f %SQLFILE%

input.sqlの内容

  • 出力先は絶対参照で指定します
copy (
    select * from test_table where category = 'dessert'
) to 'D:\test\result.csv' with csv delimiter ',' null as '' header;

【実行結果】指定したパスに同じ内容のcsvファイルが出力されます。

menu,category,price,cal
Milk chocolate mousse,dessert,390,335
Stick shoe custard,dessert,250,257
Stick shoe chocolate,dessert,250,263
Baked cheese cake,dessert,410,335

以上、バッチファイルからSQLファイルを読み込んで実行する方法でした。

参考書

ググっても見つからないものが、書籍ではさらっと書かれていたりします。