12k
All articles

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

組み込みの bun:sqlite モジュールでセットアップし、クエリ実行・トランザクション管理・Drizzle ORM による型安全な操作を解説する。

OpenReplay Team
OpenReplay Team
クイックガイド: 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は複数プロセスからの同時データベースアクセスを処理できますか?

Bun SQLiteはSQLiteのデフォルトのロックメカニズムを使用しており、複数のリーダーをサポートしますが、ライターは一度に1つのみです。大量の同時書き込みには、データベースを開いた後にdb.run('PRAGMA journal_mode = WAL')を実行してWALモードを使用することを検討してください。

Bun SQLiteのパフォーマンスはNode.jsのSQLiteライブラリと比較してどうですか?

Bun SQLiteは、ネイティブ実装と同期APIにより、Node.jsのSQLiteライブラリよりも通常2〜3倍高速です。組み込みの性質により、JavaScriptからネイティブへのオーバーヘッドが排除され、ローカルデータベース操作において特に効率的です。

Bun SQLiteが処理できる最大データベースサイズは?

Bun SQLiteはSQLiteの制限を継承し、最大281テラバイトのデータベースをサポートします。実際には、100GB未満のデータベースで優れたパフォーマンスを維持します。より大きなデータセットの場合は、適切なインデックス作成とPRAGMA最適化の使用を検討してください。

本番アプリケーションでBun SQLiteを使用しても安全ですか?

はい、Bun SQLiteは、単一サーバーアプリケーション、デスクトップアプリ、マイクロサービスなどの適切なユースケースにおいて本番環境で使用可能です。複数の書き込みノードを必要とする分散システムの場合は、代わりにPostgreSQLまたはMySQLを検討してください。

DevTools for the frontend

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.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.