Cloudflare Workers D1 with Go
Cloudflare Workers D1 アプリケーションを Go で書くときのお気に入りスタックを紹介します。今回紹介するスタックには syumai/workers, michi, sqlc が含まれています。
TL;DR
- syumai/workers は最高
- D1 を sql.Open で扱うことができる
- sql.Open で D1 を扱えるので、sqlc をそのまま使える
- HTTP Router には michi が良い感じ
モチベーション
DB を使ったアプリケーションであれば自分は sqlc を使いたいというモチベーションがそもそもありました。
Hono でアプリケーションを書いていたときは、orisano さんが作った sqlc-gen-ts-d1 という sqlc plugin を使っていました。
Hono + sqlc-gen-ts-d1 はとても使いやすかったので特に不満はありませんでしたが、仕事ならまだしも趣味で作っているアプリケーションなら Go を使いたいなという思いがずっとありました。
下の記事はちょうど2年くらい前の記事ですが、Go で Workers アプリケーションを書くことができるライブラリを syumai さんが作っているのを知っていたので Go で Workers を書きたいというモチベーションは強くありましたが、Hello World するくらいしかやってませんでした。
Cloudflare Workersで簡単にGoのHTTPサーバーを動かすためのライブラリを作った
しかし、最近 syumai さんのツイートで sql.Open で d1 を扱えるようになったというのを知り、D1 を使った実用的な Workers アプリが Go で書けるのではと色々試した結果、syumai/workers + michi + sqlc という組み合わせがいい感じだと思ったので共有します。
実際に動くもの
実際に動くものを見た方が早い人のために実装例のリンクを貼っておきます。
https://github.com/zztkm/go-workers-d1-sqlc
sqlc を選んだ理由
自分のエンジニアキャリアにおいて最初の仕事は Oracle DB を使って SQL でデータ作成をしてクライアントに納品するといった内容でした。 そのときから生クエリを書いていたので、その後の開発で ORM やクエリビルダーに触れたあとも SQL を直接書いてアプリケーションを書くというのは自分にとって普通の選択肢でした。
しかし、SQL で取得した結果を model にマッピングする実装を自分で書いていたときはマッピングミスだったり、型の違いによるバグなどが起こしていました。
そんなときに出会ったのが sqlc でした(たしか時雨堂の V さんがツイートしていたのを見かけて知った気がする)。
書いた SQL から Type Safe なコードを生成してくれるツールというのはまさに自分が求めていたものでした。
今では sqlc が普通に技術選定の選択肢になっていて、以下のように使い分けています。
- 定型クエリは sqlc
- 動的なクエリが必要なときはクエリビルダ
michi を選んだ理由
syumai/workers は HTTP Server を動かす基盤を提供してくれますが、ルーティング周りは自分で用意する必要があります。
このルーティング部分を解決するライブラリとして michi を選んだ理由は以下の機能概要を見て Cloudfare Workers で動かすのに合っているなと思ったからです。
Go 1.22のEnhanced ServeMuxに合わせて設計されたルーティングライブラリmichi より
特に外部パッケージ依存がなく小さい実装であることと 、net/http と 100 % 互換性というのは Cloudfare Workers で使っていく上で個人的に嬉しい内容です。
syumai/workers を選んだ理由
これがないと Workers Go は始まらないので、基礎ライブラリとして重要です。
ユーザーから見れば、Go 標準機能を使って HTTP Server を動かし、D1 を扱えるので、net/http や database/sql のインターフェースで使えるライブラリの恩恵を簡単に受けることができます。
この設計のおかげで、自分が使いたい sqlc や michi を利用することができています。非常に素晴らしいです。
まとめ
syumai/workers のおかげで Cloudflare Workers で Go の HTTP サーバーを動かすハードルがめちゃくちゃ下がりました。
自分はしばらく、syumai/workers + sqlc + michi という組み合わせで Workers アプリを書いていこうと思います。