PostgreSQLでストアドプロシージャ開発をする その2 ~デバッガ~

はじめに

前回に引き続き、ストアドプロシージャの開発に入門していく。
今回はデバッグの方法を学んでおく。

環境

Windows 11 Professional
PostgreSQL 17
Docker 4.36.0 (175267)

準備

PosgreSQLサーバの用意

PostgreSQLサーバは、前回と同様にDockerで構築したものを利用する。
Dockerの中身は以下の記事と同様。

PostgreSQLでストアドプロシージャ開発をする その1

PgAdmin4のインストール

今回は、SQLクライアントにPgAdmin4を使用する。
(A5M2はストアドプロシージャのステップ実行機能がないようなので利用しない。)

下記ページからダウンロード&インストールをしておく。

見方や操作は下記を参考にした。

localhostの接続まで行い、テーブルや登録されているストアドプロシージャが確認できるところまで実施する。

pgadmin-setting-01

ストアドプロシージャをステップ実行できるようにする

参考にするのは下記。

全体のディレクトリ構成

├── 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を修正

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の拡張機能を有効にするための宣言

00_create_extension.sql
CREATE EXTENSION IF NOT EXISTS pldbgapi;
01_init.sql
前回と同じのため略
02_copy_odd_todos.sql
前回と同じのため略
03_hello_world.sql
前回と同じのため略

pgAdmin4でデバッグ実行をする

pgAdmin4を起動する

pgadmin-startup-01

作成したプロシージャを右クリック「Debugging」→「Debug」を選択する

pgadmin-debugging-01

デバッガが開かれて、ブレークポイントが設定できるようになる。

pgadmin-debugging-02

実行をするときは、上にある「Continue/Start」のマークを選択する。

pgadmin-debugging-03

今回は、todos_copyテーブルがない状態で実行してみた。
すると、sqlstate42P01というものになる。

pgadmin-debugging-04

NOTICE: Skipping todo with id 1 due to error: relation "todos_copy" does not existと、RAISE NOTICEで記録したメッセージが表示されている。

pgadmin-debugging-05

※補足: ステップ実行の「Step Over」や「Step Into」は下記になる。
今回は利用していない。

pgadmin-debugging-06

実演したもののキャプチャ

参考

おわりに

デバッグの仕方を学んだ、Postgresql側での準備が多いので大変だがデバッグ環境は大事なのでローカルでの開発はこれを使っていきたい。

今回使用したDocker, PostgreSQLの設定は下記に置いた。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。