はじめに
前回に引き続き、ストアドプロシージャの開発に入門していく。
今回はデバッグの方法を学んでおく。
環境
Windows 11 Professional
PostgreSQL 17
Docker 4.36.0 (175267)
準備
PosgreSQLサーバの用意
PostgreSQL
サーバは、前回と同様にDocker
で構築したものを利用する。Docker
の中身は以下の記事と同様。
PostgreSQLでストアドプロシージャ開発をする その1
PgAdmin4のインストール
今回は、SQLクライアントにPgAdmin4
を使用する。
(A5M2
はストアドプロシージャのステップ実行機能がないようなので利用しない。)
下記ページからダウンロード&インストールをしておく。
- pgAdmin 4 (Windows)
https://www.pgadmin.org/download/pgadmin-4-windows/
見方や操作は下記を参考にした。
- 【PostgreSQL】pgAdmin4の使い方(見方から操作まで)
https://postgresweb.com/post-6741
localhost
の接続まで行い、テーブルや登録されているストアドプロシージャが確認できるところまで実施する。
ストアドプロシージャをステップ実行できるようにする
参考にするのは下記。
- Debugger | pgAdmin 4 8.13 documentation
https://www.pgadmin.org/docs/pgadmin4/development/debugger.html
全体のディレクトリ構成
├── compose.yml
├── db
│ └── Dockerfile
├── initdb
│ ├── 00_create_extension.sql
│ ├── 01_init.sql
│ ├── 02_copy_odd_todos.sql
│ └── 03_hello_world.sql
└── postgresql.conf
postgresql.confの作成
PostgreSQL
サーバ内のpostgresql.conf
を修正する必要があるので、まずはposgresql.conf
を作成する。
docker run -i --rm postgres:17 cat /usr/share/postgresql/postgresql.conf.sample > postgresql.conf
これで直下に posgresql.conf
ができた。
postgresql.confの修正
768行目にある下記を修正する。
-#shared_preload_libraries = '' # (change requires restart)
+shared_preload_libraries = 'plugin_debugger' # (change requires restart)
compose.ymlを修正
services:
db:
build:
context: ./db
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
- ./initdb:/docker-entrypoint-initdb.d
- db-data:/var/lib/postgresql/data
- ./postgresql.conf:/etc/postgresql/postgresql.conf
volumes:
db-data:
db/Dockerfileの作成
db/Dockerfile
に以下を作成する。
FROM postgres:17
RUN apt-get update && \
apt-get install -y git make gcc libkrb5-dev postgresql-server-dev-17
WORKDIR /tmp
RUN git clone https://github.com/EnterpriseDB/pldebugger
WORKDIR /tmp/pldebugger
# USE_PGXS=1 をつけること既存のPostgreSQLへの拡張インストールができる
RUN USE_PGXS=1 make
RUN USE_PGXS=1 make install
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
git make gcc libkrb5-dev postgresql-server-dev-17
この辺がないとmake
できないのでインストールをしておく。
デバッガは pldebugeer
を使用する。USE_PGXS
を有効にしてインストールする。
これは、PostgreSQLのPGXS(PostgreSQL Extension Building Infrastructure)というもの。
initdb内のスクリプトを変更する
これは、pldebugger
の拡張機能を有効にするための宣言
CREATE EXTENSION IF NOT EXISTS pldbgapi;
前回と同じのため略
前回と同じのため略
前回と同じのため略
pgAdmin4でデバッグ実行をする
pgAdmin4を起動する
作成したプロシージャを右クリック「Debugging」→「Debug」を選択する
デバッガが開かれて、ブレークポイントが設定できるようになる。
実行をするときは、上にある「Continue/Start」のマークを選択する。
今回は、todos_copy
テーブルがない状態で実行してみた。
すると、sqlstate
が42P01
というものになる。
- 参考: 付録A PostgreSQLエラーコード
https://www.postgresql.jp/document/16/html/errcodes-appendix.html
NOTICE: Skipping todo with id 1 due to error: relation "todos_copy" does not exist
と、RAISE NOTICE
で記録したメッセージが表示されている。
※補足: ステップ実行の「Step Over」や「Step Into」は下記になる。
今回は利用していない。
実演したもののキャプチャ
参考
【PostgreSQL】pgAdmin4の使い方(見方から操作まで)
https://postgresweb.com/post-6741pgAdmin4でPL/pgsqlをデバッグする
https://qiita.com/mkyz08/items/af7865a50d6303154df7Debugger | pgAdmin 4 8.13 documentation
https://www.pgadmin.org/docs/pgadmin4/development/debugger.htmlEnterpriseDB / pldebugger
https://github.com/EnterpriseDB/pldebuggerpostgres | dockerhub
https://hub.docker.com/_/postgresChatGPTとの会話
https://chatgpt.com/share/675524ca-8b24-8001-9fd1-9fe4466eda33
おわりに
デバッグの仕方を学んだ、Postgresql
側での準備が多いので大変だがデバッグ環境は大事なのでローカルでの開発はこれを使っていきたい。
今回使用したDocker
, PostgreSQL
の設定は下記に置いた。
- katsuobushiFPGA / postgresql-procedure-dev
https://github.com/katsuobushiFPGA/postgresql-procedure-dev