Bun 1.3 の組み込み SQLite / Redis クライアントを実際に動かす

Bun は「ランタイム+パッケージマネージャ+バンドラ+テストランナー」を 1 バイナリにまとめた JavaScript 実行環境だ。1.3 系では組み込みの Redis クライアントが追加され、以前からある組み込み SQLite ドライバとあわせて、データベース系の定番処理を外部パッケージなしで書けるようになった。better-sqlite3ioredisnpm 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
2
3
curl -fsSL https://bun.sh/install | bash
bun --version
# 例: 1.3.14

SQLite(サーバ不要・そのまま動く)

db.ts として保存する。インメモリ DB にテーブルを作り、プリペアドステートメントで挿入・検索する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Database } from "bun:sqlite";

const db = new Database(":memory:");
db.run(`CREATE TABLE tasks (id INTEGER PRIMARY KEY, title TEXT, done INTEGER)`);

const insert = db.prepare("INSERT INTO tasks (title, done) VALUES (?, ?)");
insert.run("write blog", 0);
insert.run("verify code", 1);

const rows = db.query("SELECT id, title, done FROM tasks WHERE done = ?").all(0);
console.log(rows);

const count = db.query("SELECT count(*) AS n FROM tasks").get() as { n: number };
console.log("total:", count.n);

実行する。

1
bun run db.ts

期待される出力。

1
2
3
4
5
6
7
8
[
{
id: 1,
title: "write blog",
done: 0,
}
]
total: 2

.all() は行の配列、.get() は先頭 1 行を返す。? プレースホルダに .run(...) / .all(...) の引数がバインドされる。ファイルに保存したい場合は new Database(":memory:")new Database("app.db") に変えるだけだ。

Redis(要: 稼働中の Redis サーバ)

Redis のデモは実際の Redis が必要になる。ローカルに用意する(例。macOS の Homebrew)。

1
2
3
4
brew install redis
redis-server --port 6390 --daemonize yes
redis-cli -p 6390 ping
# PONG

redis-demo.ts として保存する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { RedisClient } from "bun";

const redis = new RedisClient("redis://localhost:6390");

await redis.set("visits", "0");
await redis.incr("visits");
await redis.incr("visits");
const visits = await redis.get("visits");
console.log("visits:", visits);

await redis.set("user:1", JSON.stringify({ name: "Hashito" }), "EX", 60);
const raw = await redis.get("user:1");
console.log("user:1:", raw);

redis.close();

実行する。

1
bun run redis-demo.ts

期待される出力。

1
2
visits: 2
user:1: {"name":"Hashito"}

incr でカウンタが 2 になり、set(..., "EX", 60) で TTL 60 秒付きの値を書けている。使い終わったら Redis を止める。

1
redis-cli -p 6390 shutdown nosave

どこで効くか

サーバレス関数や CLI ツールのように「起動が軽いこと」「依存が少ないこと」が効く場面で、bun:sqlite は組み込み KVS 兼軽量 RDB として、RedisClient は外部キャッシュ・カウンタとして、追加インストールなしで使える。ネイティブアドオンのビルド失敗に悩まされない点も、CI やコンテナで地味にありがたい。

まとめ

Bun 1.3 は SQLite と Redis のクライアントを標準で持つ。bun:sqlite はサーバ不要でそのまま動き、RedisClient は稼働中の Redis に対して get/set/incr を依存ゼロで叩ける。上のコードは Bun 1.3.14 で実行を確認済みなので、手元にコピーしてそのまま試せる。

出典


Bun 1.3 の組み込み SQLite / Redis クライアントを実際に動かす
https://blog.hashito.biz/2026/07/11/try-bun-1-3-builtin-sqlite-redis-clients/
著者
hashito
作成日
2026年7月11日
著作権