Back

クイックガイド: Bun + SQLite セットアップ

クイックガイド: 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" }
])

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:sqliteDrizzle 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.

OpenReplay