PowerShell と PostgreSQL
PowerShell
今回は、WindowsServer で PowerShell を使い、PostgreSQL に接続して SQL を発行するスクリプトを作成したいと思います。
その過程で使用した基本的なコマンドの使い方を残しておきたいと思います。
ファイル構成
メインは powershell_postgresql.ps1 で、環境情報は connection.ps1 に持たせて、実行するSQLは sample.sql とします。
ログファイルは、同一フォルダ内に powershell_sample.log というログファイルを生成します。
処理フローのイメージ図
SQL ファイルを実行するだけのいたってシンプルな作りです。
connection.ps1 と sample.sql を準備
connection.ps1
変数の定義は「 $変数 = "文字列" 」です。以下のように環境情報を定義しています。
PostgreSQL のパスワードは pgpass.conf の中
上記の「connection.ps1」の "#PASSWORD" に注目してほしいのですが、コメントアウトになっています。
今回は、psql コマンドを使って PostgreSQL に接続するのですが、このファイルでパスワードは指定できません。
psql はデフォルトでパスワードが対話式に聞かれます。
ただ、対話式のパスワード入力を回避する策も用意されています。以下のファイルにパスワード情報を定義しておく方法です。
- C:\Users\xxxxx\AppData\Roaming\postgres\pgpass.conf
バッチ処理でスクリプトを動かす場合などは、このファイルを使うことになります。今回もその方法を取っています。
pgpass.conf の中身はこんな感じです。
sample.sql
あくまでサンプルなので適当な SQL を書いておきましょう。
powershell_postgresql.ps1
実行順序
以下のような順序で処理していきます。
- 環境ファイル・SQL ファイルのファイル名定義
- ログファイル生成
- 出力メッセージのフォーマット定義
- 環境ファイル・SQL ファイルの存在確認
- 環境ファイルの読み込み
- psql で sql 実行
- 処理結果を受けエラーハンドリング
1. 環境ファイル・SQL ファイルのファイル名定義
スクリプトが置いてあるパスは PowerShell の自動変数 $PSScriptRoot で取得することができます。
2. ログファイルの作成
ログファイルの作成でよく使うロジックがこれですね。
3. 出力メッセージのフォーマット定義
ログに出すメッセージは同じフォーマットで書き込みたいですよね。
- 先頭に "yyyy/MM/dd HH:mm:ss" を挿入
- 通常時の出力形式とエラー時の出力形式を用意
function と switch を使うとこのようにメッセージのフォーマットを定義することが出来ます。
4. 環境ファイル・SQL ファイルの存在確認
function の使い方はこうです。
たとえば、sample.sql が存在しない場合は、以下のようなメッセージが出力されます。
5. 環境ファイルの読み込み
以下の方法( . ※ドット)で .ps1 ファイルの読み込みは可能です。
6. psql で sql 実行
$error には配列でエラー情報が格納されていきます。
そのため、$error の内容をリセットしないと、エラーが発生する度に $error の配列が増え続けます。
以下のスクリプトでは、$error.Count で配列の数をエラーハンドリングで使用しています。つまり、処理の先頭で $error を掃除しておかないと、エラー処理に回され続けてしまうのです。
psql コマンドの注意点① [ psql -w ]
psql コマンドは基本的に対話式でパスワードを聞いてくることは前半で説明しました。
たとえば、バッチ処理の中でパスワードが対話式で聞かれてしまうと、バッチ処理が終わらなくなってしまいます。
psql をスクリプトに応用する際、環境ファイルの内容が間違っていて、パスワードを対話式で聞かれる状態となったときのことを考慮しておく必要があります。
psql コマンドの注意点② [ psql -a 2>&1]
psql の引数「 -a 」で発行クエリもログに出力されます。また、「2>&1」とすることで、標準エラー出力もログファイルに出力されます。
ただ、PowerShell の仕様で $error にも標準エラー出力は格納されています。
7. 処理結果を受けエラーハンドリング
$error からエラーの件数を取得して、処理を分岐させます。
$error の使い方
私は以下の使い方だけ把握しておけば、そんなに困らないと思っています。
powershell_postgresql.ps1
最後に全文を載せておきます。
以上です。
Icons made by Flat Icons from www.flaticon.com