さて、自分で初めてプロシージャや関数を書いて実行してみたけど、なんかうまくいかないことってあるよね。もちろん、RAISE NOTICEをたくさん入れて「どこで船が座礁したのか」探すこともできる。でもさ!せっかくpgAdminにデバッグ機能があるんだから、わざわざ苦労する必要ないでしょ?
pgAdminなら、コードをステップ実行したり、ブレークポイント(breakpoints)を設定したり、変数の値を確認したり、エラーの原因を探したりできるんだ。まさに「探偵セット」みたいに、「なんで自分のクエリが動かないの?」って謎を解くのにピッタリ!
なんでpgAdminでデバッグするの?
たまにプロシージャのバグがめっちゃ深いところに隠れてて、ログやターミナルのテキストだけじゃ全然分からなくて地獄みたいになることあるよね。そんなとき、ステップ実行で関数の中身を全部見れるデバッグが超役立つ。難しいパズルをヒント付きで解く感じ!
pgAdminのデバッグを使うと、こんなことができる:
- ブレークポイント(breakpoints)を設定できる ― ここでコードの実行が止まるから、その時点の状態をじっくり見れる。
- SQLコードを一歩ずつ実行できる ― どのステートメントが実行されてるか、マジで一歩一歩確認できる。
- 変数の値をリアルタイムで確認できる ― データがちゃんと渡ってるか、処理されてるかチェックできる。
- エラーが起きた場所を特定して、原因を理解できる。
始め方:pgAdminでデバッグする準備
デバッグを始める前に、ちゃんと設定できてるか確認しよう。
plpgsql拡張機能を有効にする
自分のデータベースでPL/pgSQLプログラミング言語が有効になってるかチェックしよう:
CREATE EXTENSION IF NOT EXISTS plpgsql;
この言語は普通PostgreSQLでデフォルトで有効になってるけど、一応確認しとこう。
pgAdminはバージョン4以上をインストールしてね(デバッグ機能が使えるから)。まだ持ってなかったら、公式サイトからダウンロードできるよ。
pldbgapi拡張機能のインストール
pgAdminでPL/pgSQLのデバッグを有効にするには、pldbgapi拡張機能を有効にする必要がある:
CREATE EXTENSION IF NOT EXISTS pldbgapi;
この拡張はデバッガーと連携するために作られてるんだ。
めっちゃ大事!!!このクエリを実行するにはPostgreSQLサーバーの管理者権限が必要だから注意してね。
デバッグの基本:ブレークポイント(breakpoints)の設定
ブレークポイント(breakpoints)は、プロシージャや関数の実行を一時停止できる特別な場所。長い道のりの途中でちょっと休憩して、地図を確認してからまた進む、みたいな感じだね。
pgAdminでブレークポイントを設定するには?
- pgAdminを開いて、自分のデータベースに接続する。
- オブジェクトツリーから自分の関数やプロシージャを探す:Functions → <自分のスキーマ> → <自分の関数>。
- 関数を右クリックして、Debugging → Debugを選択。これでデバッガーが起動するよ。
- 関数のコードが表示されたウィンドウで、デバッグを始めたい行の左側の余白をクリック。赤い丸が出てきたら、それがブレークポイント!
こんな感じになるよ:
CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
RAISE NOTICE '君が選んだid: %', id;
-- ここにブレークポイントを設定できる
PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;
ブレークポイントを設定したら、関数の実行を開始して、その場所でピタッと止まる。そこで変数の値や、前のステートメントの結果を確認したり、もちろんそのまま実行を続けたりできるよ。
pgAdminで変数を確認する
コードが止まったのを確認するだけじゃなくて、その時点でどんなデータがメモリにあるか分かるともっと便利だよね。例えば:
- 入力パラメータがどんな値か。
- 特定のブロックを実行した後、変数がどう変わったか。
- クエリがどんな値を返したか。
変数の値をどうやって見るの?
関数の実行がブレークポイントで止まったら:
- デバッグウィンドウの下にあるVariablesタブに移動する。
- ここで全ての変数とその現在の値が一覧で見れるよ。
例えば、こんな関数があるとする:
CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
discounted_price NUMERIC;
BEGIN
discounted_price := price - (price * discount / 100);
RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;
discounted_priceの行にブレークポイントを置くと、デバッガーはpriceとdiscountにはすでに値が入ってるけど、discounted_priceはまだ空っぽだって教えてくれる。
ブレーク後の変数リストはこんな感じ:
| 変数 | 値 |
|---|---|
price |
100.00 |
discount |
15.00 |
discounted_price |
NULL |
この行を実行した後、discounted_priceは85.00に変わるよ。
コードをステップ実行する
デバッガーウィンドウでは、次のボタンで関数の実行をコントロールできる:
- Step Over ― 今のステートメントを実行して次に進む。
- Step Into ― 呼び出された関数やプロシージャの中に「潜る」ことができる。
- Continue ― 次のブレークポイントか、実行が終わるまで続ける。
実践編:複雑な関数のデバッグ
じゃあ、もうちょっと複雑な関数を書いてデバッグしてみよう。
例:注文処理
CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
order_status TEXT;
total_amount NUMERIC;
BEGIN
-- 注文ステータスを設定
SELECT status INTO order_status
FROM orders
WHERE id = order_id;
IF order_status = 'Pending' THEN
-- 注文金額を計算
SELECT SUM(price * quantity) INTO total_amount
FROM order_items
WHERE order_id = order_id;
-- 注文ステータスを更新
UPDATE orders
SET status = 'Processed', processed_date = NOW()
WHERE id = order_id;
RETURN '注文が処理された。合計金額: ' || total_amount;
ELSE
RETURN '注文はすでに処理済みか存在しません。';
END IF;
END;
$$ LANGUAGE plpgsql;
ブレークポイントを置ける場所:
SELECT status INTO order_statusの行。SELECT SUM(price * quantity) INTO total_amountの行。
デバッグ中にできること:
order_statusが本当に'Pending'になってるか確認する。total_amountがちゃんと計算されてるかチェックする。
よくあるエラーとその対処法
pgAdminでデバッグしてると、こんなトラブルに遭遇するかも:
- 関数がリストに表示されない。 本当に関数がデータベースに作成されてるか、正しいデータベースに接続してるか確認しよう。
ブレークポイントが効かない。
pldbgapi拡張が有効になってるか、必要な権限があるかチェックしてね。デバッガーの接続エラー。 PostgreSQLサーバーがデバッグ用に設定されてるか(
shared_preload_librariesにpldbgapiが含まれてるか)確認しよう。
pgAdminを使ったPL/pgSQLのデバッグは、めっちゃ簡単で直感的。ブレークポイントを置いて、変数の「中身」を見て、バグを直せば、理想のアプリに一歩近づくよ!
GO TO FULL VERSION