KDOC 495: 文芸的にDB動作を検証できるようにする

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

文芸的にDB動作を検証できるようにした。

背景

「Postgres で試した?」と聞き返せるようになるまでもしくはなぜ私は雰囲気で技術を語るのか?を読んで、データベースの機能について知らないことが多いのを知った。

コンピュータのほかの事柄と同様に、じっさいに試して、挙動を仔細にみて背景にあるアイデアを理解し、自分なりのモデルを構築していくのが必要に見えた。REPLでいじるだけでなく、体系立てて記録しつつ試していけるとよさそうである。

そういうことを気軽にできるようにした。

要件

  • 少ない準備で気軽にデータベースを実行できる
  • 文芸的プログラミングができる。入力と標準出力をテキストに残し、そのままドキュメント化できる
    • 入力クエリを出力にエコー表示できる
  • 毎回クリーンな環境で、完全に再現できる
  • org-mode org-babelの sql ブロックから直接使える
  • 完全に同等の機能が使える。インデックス、EXPLAIN、トランザクション…が使える

使用例

リポジトリはkijimad/pgpgにある。

根本的なアイデアは、データベースのプロキシを実装し、フック処理を追加することである。プロキシで、実験に必要な処理(DB初期化と削除)を実行する。

docker compose up -d
:PROPERTIES:
  :header-args+: :results table
  :header-args+: :database postgres
  :header-args+: :dbhost localhost
  :header-args+: :dbport 15432
  :header-args+: :dbuser postgres
  :header-args+: :engine postgresql
:END:

あとは、org-babelでSQLを実行して評価する。

select 1+1 as result;
|                         |
|-------------------------|
| > select 1+1 as result; |
| result                  |
| 2                       |

データベースは接続のたびにリセットされる。完全に再現可能で、あとで読みやすい。

CREATE TABLE users (
    name varchar(255),
    tel integer
);
INSERT INTO users (name, tel) VALUES ('きじま', 100);
SELECT * FROM users;
|                                                         |     |
|---------------------------------------------------------+-----|
| > CREATE TABLE users (                                  |     |
| >     name varchar(255),                                |     |
| >     tel integer                                       |     |
| > );                                                    |     |
| CREATE TABLE                                            |     |
|                                                         |     |
| > INSERT INTO users (name, tel) VALUES ('きじま', 100); |     |
| INSERT 0 1                                              |     |
|                                                         |     |
| > SELECT * FROM users;                                  |     |
| name                                                    | tel |
| きじま                                                  | 100 |

関連