🐁

Go で PostgreSQL を開発しやすくするために欲張ったら管理がめんどくさくなった構成

2024/05/05に公開

はじめに

RDB( PostgreSQL ) をサポートするツールってたくさんありますよね。
いろいろ組み合わせれば理想の開発環境が構築できるかもしれない。
そう思っていろいろ組み合わせた結果、ただ管理するのがめんどくさそうになったという記事です。
ちなみに、本番運用の実績はありませんのでご了承ください。

ライブラリ(ツール)

今回は以下のライブラリ(ツール)を目的に応じて使いわけます。

ライブラリ(ツール) バージョン 目的
https://github.com/prisma/prisma 5.13.0 マイグレーション
https://github.com/volatiletech/sqlboiler 4.16.2 Command(書込)用コード自動生成
https://github.com/sqlc-dev/sqlc 1.26.0 Query(読込)用コード自動生成
https://github.com/amacneil/dbmate 1.16.2 sqlc の自動生成に必要なDDLファイルを自動生成

Prisma

https://www.prisma.io/

開発体験がすこぶるよいと信じてやまないマイグレーションツールです。
個人的にすごく好きですがまだ本番利用の経験はありません。
いくつか関連する記事を書いているのでご参考ください。

https://zenn.dev/otakakot/articles/85e3620bcd2daa

https://zenn.dev/otakakot/articles/6c6668af0f95d7

sqlboiler

https://github.com/volatiletech/sqlboiler

Command(書込)用のコードを自動生成するために使います。
Query(読込)用のコードも自動生成されますが複雑なクエリを実装しようとすると困りそうな気がしたので使わないことにしています。
ほかにも xo という自動生成ライブラリが存在しますが、スター数や実際の使い心地を考えて sqlboiler を選定しています。
比較した記事もあるのでご参考ください。

https://zenn.dev/otakakot/articles/df3e935ac0e6a8

sqlc

https://sqlc.dev/

Query(読込)用のコードを自動生成するために使います。

この記事を書いたモチベーションは sqlc のキャッチアップです。
ちょこちょこ sqlc というワードを目にする機会が増え気になっていました。

Command(書込)用のコードも自動生成できますがそんなに複雑なクエリを必要とする場面がない気がしたので使わないことにしています。

誤算だったのがコード自動生成に対して DDL ファイルが必要だったということです。
DML だけでコード自動生成できるかと思っていました。
( なしでもいけるかと思い試しましたが無理そうでした ... )

DDL ファイルを用意するために dbmate を利用します。
prisma でマイグレーションを行なっているので別のツールを使って DDL を用意します。
(prisma って DDL 吐き出せますかね ... CLI の help や公式ドキュメントを見た感じなさそうでした。知っている方いましたら教えてください。)

uuid を扱いやすく

PostgreSQL は uuid を型として設定できます。
Prisma も uuid を型として設定できます。
自動生成においてとくになにもしなかった場合 uuid に対して sqlboiler は string 型、sqlc は pgtype.UUID 型が設定されます。

このままでもよいですが便利にするために google/uuid をそれぞれ使えるように設定します。
実際の設定ファイルは以下となります。

https://github.com/otakakot/sample-go-postgres-assist/blob/main/sqlboiler.yaml#L16-L23

( sqlboiler は toml が標準となっていそうですが、sqlc に合わせて yaml にしています。 )

https://github.com/otakakot/sample-go-postgres-assist/blob/main/sqlc.yaml#L13-L17

おわりに

あれやこれやをしていたら管理するライブラリ(ツール)が増えてしまいました。
これは管理がめんどくさいですね。
各種ライブラリ(ツール)のキャッチアップコストもかかりますし。
そう考えるとRDBまわりは生SQLを触るのがよいのですかね ...

今回実装したコードは以下に置いておきます。

https://github.com/otakakot/sample-go-postgres-assist

Discussion