Veltioblog

Cloudflare Workers D1 with Go

Cloudflare Workers D1 アプリケーションを Go で書くときのお気に入りスタックを紹介します。今回紹介するスタックには syumai/workers, michi, sqlc が含まれています。


TL;DR

モチベーション

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 が普通に技術選定の選択肢になっていて、以下のように使い分けています。

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 アプリを書いていこうと思います。