dindでsqlc+dockertest

この抜粋の内容は次のとおりです。

- 環境構築
- sqlc
- dockertest
- go test

```mermaid
flowchart LR
    VSCode
    dind["dind
    postgres"]
    devcontainer["devcontainer
    Go"]
    VSCode -->|go test| devcontainer -->|query| dind
```

さらに詳しく知りたい方は読み続けてください。

---

2023年8月1回目です。

[sqlc](https://github.com/sqlc-dev/sqlc) + [dockertest](https://github.com/ory/dockertest) についてです。

日々、database に悩まされます。例えば、query の tuning など。

また、developer が好む ORM は、query が隠蔽されるため、どんな query なのか、認識するのに時間が必要な場合が多いです。

slow query の場合、どんな query なのか確認するには、実行ログを見るか、developer に確認するかしかありません。

これらの課題を解消するのが、sqlc + dockertest です。

このメモには、sqlc と dockertest を使った開発環境の構築と dockertest での Query の実行までを書きます。

## 環境構築
- devcontainer + Docker in Docker（dind）で設定します。

https://github.com/danny-yamamoto/go-dockertest-example/blob/0ea3af73b77dbd83cc5dba94593252ca4b754003/.devcontainer/devcontainer.json#L9

## sqlc
sqlc は、
> sqlc: A SQL Compiler

です。
要するに query を用意して、generate を実行すると、その Query の関数を用意してくれます。こんな感じで。

- query

https://github.com/danny-yamamoto/go-dockertest-example/blob/0ea3af73b77dbd83cc5dba94593252ca4b754003/sql/query.sql#L1-L3

- generated

https://github.com/danny-yamamoto/go-dockertest-example/blob/0ea3af73b77dbd83cc5dba94593252ca4b754003/tutorial/query.sql.go#L44-L54

定義内容は、sql の[チュートリアル](https://docs.sqlc.dev/en/latest/tutorials/getting-started-postgresql.html)のとおりです。そちらをご確認下さい。

https://docs.sqlc.dev/en/latest/tutorials/getting-started-postgresql.html

## dockertest
- dockertest の使い方は、`TestMain` で用意したデータベース container に対して、test を用意します。
- テスト用の schema を用意する必要があります。

https://github.com/danny-yamamoto/go-dockertest-example/blob/main/cmd/server/server_test.go

## go test
- それでは、dockertest の動きを確認します。
- `go test` を実行します。
```bash
vscode ➜ /workspaces/go-dockertest-example (main) $ go test ./cmd/server/
ok      github.com/danny-yamamoto/go-dockertest-example/cmd/server      (cached) [no tests to run]
vscode ➜ /workspaces/go-dockertest-example (main)
```

- DB Container を clean up せずに実行すると、任意の port で起動した container が残ります。
```bash
vscode ➜ /workspaces/go-dockertest-example (main) $ docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS                           PORTS                     NAMES
d96599c756b5   postgres:14.8   "docker-entrypoint.s…"   2 hours ago    Exited (255) About an hour ago   0.0.0.0:32774->5432/tcp   upbeat_easley
369e6dec2e83   postgres:14.8   "docker-entrypoint.s…"   2 hours ago    Exited (255) About an hour ago   0.0.0.0:32773->5432/tcp   quirky_borg
61e0b9313286   postgres:14.8   "docker-entrypoint.s…"   2 hours ago    Exited (255) About an hour ago   0.0.0.0:32772->5432/tcp   admiring_jones
240c0cdca970   postgres:14.8   "docker-entrypoint.s…"   2 hours ago    Exited (255) About an hour ago   0.0.0.0:32771->5432/tcp   recursing_perlman
a48f00f7fd03   postgres:14.8   "docker-entrypoint.s…"   2 hours ago    Exited (255) About an hour ago   0.0.0.0:32770->5432/tcp   romantic_beaver
02c0360d302d   postgres:14.8   "docker-entrypoint.s…"   2 hours ago    Exited (255) About an hour ago   0.0.0.0:32769->5432/tcp   xenodochial_ishizaka
4f0e743efa78   postgres:14.8   "docker-entrypoint.s…"   17 hours ago   Exited (1) 17 hours ago                                    optimistic_einstein
vscode ➜ /workspaces/go-dockertest-example (main) $ 
```

## Summary
- sqlc と dockertest について書きました。
- devcontainer を使った dind 構成にしたことで、decontainer（docker）からpostgres（dind）にどう繋ぐのか理解するのに時間がかかりました。
- dind の clean up を忘れると、process が溜まり続けるので注意が必要です。しかし、devcontainer にしてあるため、container を捨てれば解決します。
- 今後、Cloud Build や GitHub Actions などでの動作を確認したいと思います。