Bun 1.3 の組み込み SQLite / Redis クライアントを実際に動かす
Bun は「ランタイム+パッケージマネージャ+バンドラ+テストランナー」を 1 バイナリにまとめた JavaScript 実行環境だ。1.3 系では組み込みの Redis クライアントが追加され、以前からある組み込み SQLite ドライバとあわせて、データベース系の定番処理を外部パッケージなしで書けるようになった。better-sqlite3 や ioredis を npm install しなくてよい、という地味だが効く変化だ。
この記事では、その 2 つを依存ゼロで動かす。
bun:sqlite: SQLite が標準で入っている
bun:sqlite は Bun に同梱された同期 API の SQLite ドライバで、import { Database } from "bun:sqlite" だけで使える。ネイティブアドオンのビルドも node-gyp も要らない。
Bun.RedisClient: Redis クライアントも組み込み
Bun 1.3 では import { RedisClient } from "bun" で Redis クライアントが使える。get/set/incr などのコマンドがメソッドとして生えており、ioredis を入れずにキャッシュやカウンタを書ける。
実際に試す
前提: Bun 1.3 以上(この記事は 1.3.14 で検証)。未インストールなら次で入る(macOS / Linux)。
1 | |
SQLite(サーバ不要・そのまま動く)
db.ts として保存する。インメモリ DB にテーブルを作り、プリペアドステートメントで挿入・検索する。
1 | |
実行する。
1 | |
期待される出力。
1 | |
.all() は行の配列、.get() は先頭 1 行を返す。? プレースホルダに .run(...) / .all(...) の引数がバインドされる。ファイルに保存したい場合は new Database(":memory:") を new Database("app.db") に変えるだけだ。
Redis(要: 稼働中の Redis サーバ)
Redis のデモは実際の Redis が必要になる。ローカルに用意する(例。macOS の Homebrew)。
1 | |
redis-demo.ts として保存する。
1 | |
実行する。
1 | |
期待される出力。
1 | |
incr でカウンタが 2 になり、set(..., "EX", 60) で TTL 60 秒付きの値を書けている。使い終わったら Redis を止める。
1 | |
どこで効くか
サーバレス関数や CLI ツールのように「起動が軽いこと」「依存が少ないこと」が効く場面で、bun:sqlite は組み込み KVS 兼軽量 RDB として、RedisClient は外部キャッシュ・カウンタとして、追加インストールなしで使える。ネイティブアドオンのビルド失敗に悩まされない点も、CI やコンテナで地味にありがたい。
まとめ
Bun 1.3 は SQLite と Redis のクライアントを標準で持つ。bun:sqlite はサーバ不要でそのまま動き、RedisClient は稼働中の Redis に対して get/set/incr を依存ゼロで叩ける。上のコードは Bun 1.3.14 で実行を確認済みなので、手元にコピーしてそのまま試せる。