dindでsqlc+dockertest

2023/08/02に公開

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

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

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


2023年8月1回目です。

sqlc + 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

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 を実行します。
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 が残ります。
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 などでの動作を確認したいと思います。

Discussion