クイックガイド: Bun + SQLite セットアップ
Bunプロジェクトに高速で依存関係のないデータベースが必要ですか?Bun SQLiteのセットアップはわずか数分で完了し、外部依存関係や複雑な設定なしで強力なローカルデータベースを利用できます。bun:sqliteの使い始め方とプロジェクトへの統合方法について、必要な情報をすべてご紹介します。
重要なポイント
- Bunには組み込みのSQLiteドライバーが含まれており、npmパッケージは一切不要
- 同期APIがローカルデータベースに高いパフォーマンスを提供
- プリペアドステートメントがセキュリティと速度の両面でメリットを提供
- トランザクションが複数ステップの操作におけるデータ整合性を保証
Bun SQLiteを始める
組み込みのbun:sqliteモジュールは、ローカル開発、プロトタイプ、小規模な本番アプリケーションに最適な、同期型の高性能SQLiteドライバーを提供します。npmパッケージは不要で、Bunにすでに含まれています。
基本的なデータベース接続
import { Database } from "bun:sqlite"
// Create or open a database file
const db = new Database("app.db")
// Or use an in-memory database for testing
const memDb = new Database(":memory:")
これだけで、Bun SQLiteのデータベース接続が動作します。データベースファイルが存在しない場合は自動的に作成されます。
bun:sqliteで最初のクエリを実行する
テーブルの作成と基本操作
// Create a table
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
)
`)
// Insert data using parameters (prevents SQL injection)
const insertUser = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)")
insertUser.run("Alice", "alice@example.com")
// Query data
const getUser = db.prepare("SELECT * FROM users WHERE name = ?")
const user = getUser.get("Alice")
console.log(user) // { id: 1, name: "Alice", email: "alice@example.com" }
// Get all results
const allUsers = db.prepare("SELECT * FROM users").all()
Bun SQLiteのAPIはデフォルトでプリペアドステートメントを使用するため、クエリは安全かつ高速です。.get()メソッドは単一の行を返し、.all()は一致するすべての行の配列を返します。
トランザクションの使用
一緒に成功または失敗する必要がある操作には、トランザクションを使用します:
const insertMany = db.transaction((users) => {
const stmt = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)")
for (const user of users) {
stmt.run(user.name, user.email)
}
})
// This either inserts all users or none
insertMany([
{ name: "Bob", email: "bob@example.com" },
{ name: "Charlie", email: "charlie@example.com" }
])
Discover how at OpenReplay.com.
Bun SQLiteの高度な機能
名前付きパラメータの使用
名前付きパラメータは複雑なクエリをより読みやすくします:
const query = db.prepare(`
SELECT * FROM users
WHERE name = $name AND email = $email
`)
const result = query.get({
$name: "Alice",
$email: "alice@example.com"
})
異なる戻り値の型の処理
Bun SQLiteはデータ取得のための複数のメソッドを提供します:
const stmt = db.prepare("SELECT * FROM users")
// Get first row as object
const firstUser = stmt.get()
// Get all rows as objects
const allUsers = stmt.all()
// Get values as arrays (useful for data processing)
const values = stmt.values()
// Returns: [[1, "Alice", "alice@example.com"], [2, "Bob", "bob@example.com"]]
// Execute without returning results (for INSERT/UPDATE/DELETE)
stmt.run()
Drizzle ORMとの統合
大規模なプロジェクトでは、bun:sqliteとDrizzle ORMを組み合わせることで、型安全性と優れた開発者体験が得られます:
// Install Drizzle
// bun add drizzle-orm drizzle-kit
import { drizzle } from 'drizzle-orm/bun-sqlite'
import { Database } from 'bun:sqlite'
const sqlite = new Database('app.db')
const db = drizzle(sqlite)
// Now use Drizzle's type-safe query builder
const users = await db.select().from(usersTable)
ベストプラクティスとパフォーマンスのヒント
常に接続をクローズする
Bun SQLiteはガベージコレクション時に自動的にデータベースをクローズしますが、明示的にクローズすることが推奨されます:
// When done with the database
db.close()
プリペアドステートメントを使用する
Bun SQLiteのプリペアドステートメントはキャッシュされて再利用されるため、繰り返しクエリに対してより良いパフォーマンスを提供します:
// Good: Prepare once, use many times
const stmt = db.prepare("SELECT * FROM users WHERE id = ?")
for (const id of userIds) {
const user = stmt.get(id)
// Process user
}
// Less efficient: Creating new statement each time
for (const id of userIds) {
const user = db.prepare("SELECT * FROM users WHERE id = ?").get(id)
}
適切なストレージモードを選択する
- 永続データには、ファイルベースのデータベース(
Database("app.db"))を使用 - テストや一時データには、インメモリデータベース(
Database(":memory:"))を使用 - 静的データセットには、読み取り専用モード(
Database("data.db", { readonly: true }))を使用
まとめ
Bun SQLiteは、外部依存関係なしでローカルデータベース操作に必要なすべてを提供します。CLIツール、APIプロトタイプ、小規模な本番サービスのいずれを構築する場合でも、組み込みのbun:sqliteモジュールはシンプルさとパフォーマンスの完璧なバランスを提供します。クイックスクリプトには同期APIから始め、型安全性とマイグレーションが必要になったらDrizzle ORMを追加しましょう。わずか数行のコードで、完全に機能するSQLデータベースがすぐに使えます。
よくある質問
Bun SQLiteはSQLiteのデフォルトのロックメカニズムを使用しており、複数のリーダーをサポートしますが、ライターは一度に1つのみです。大量の同時書き込みには、データベースを開いた後にdb.run('PRAGMA journal_mode = WAL')を実行してWALモードを使用することを検討してください。
Bun SQLiteは、ネイティブ実装と同期APIにより、Node.jsのSQLiteライブラリよりも通常2〜3倍高速です。組み込みの性質により、JavaScriptからネイティブへのオーバーヘッドが排除され、ローカルデータベース操作において特に効率的です。
Bun SQLiteはSQLiteの制限を継承し、最大281テラバイトのデータベースをサポートします。実際には、100GB未満のデータベースで優れたパフォーマンスを維持します。より大きなデータセットの場合は、適切なインデックス作成とPRAGMA最適化の使用を検討してください。
はい、Bun SQLiteは、単一サーバーアプリケーション、デスクトップアプリ、マイクロサービスなどの適切なユースケースにおいて本番環境で使用可能です。複数の書き込みノードを必要とする分散システムの場合は、代わりにPostgreSQLまたはMySQLを検討してください。
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.