Schnellanleitung: Bun + SQLite Setup
Benötigen Sie eine schnelle, abhängigkeitsfreie Datenbank für Ihr Bun-Projekt? Die Einrichtung von Bun SQLite dauert nur wenige Minuten und bietet Ihnen eine leistungsstarke lokale Datenbank ohne externe Abhängigkeiten oder komplexe Konfigurationen. Hier finden Sie alles, was Sie für den Einstieg mit bun:sqlite und die Integration in Ihre Projekte benötigen.
Wichtigste Erkenntnisse
- Bun enthält einen integrierten SQLite-Treiber, der keine npm-Pakete benötigt
- Die synchrone API bietet hohe Performance für lokale Datenbanken
- Prepared Statements bieten sowohl Sicherheits- als auch Geschwindigkeitsvorteile
- Transaktionen gewährleisten Datenintegrität bei mehrstufigen Operationen
Erste Schritte mit Bun SQLite
Das integrierte bun:sqlite-Modul bietet einen synchronen, hochperformanten SQLite-Treiber, der sich perfekt für lokale Entwicklung, Prototypen und kleine Produktionsanwendungen eignet. Keine npm-Pakete erforderlich – es ist bereits Teil von Bun.
Grundlegende Datenbankverbindung
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:")
Das war’s – Sie haben jetzt eine funktionierende Bun SQLite-Datenbankverbindung. Die Datenbankdatei wird automatisch erstellt, falls sie nicht existiert.
Ihre ersten Abfragen mit bun:sqlite ausführen
Tabellen erstellen und grundlegende Operationen
// 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()
Die Bun SQLite-API verwendet standardmäßig Prepared Statements, wodurch Ihre Abfragen sowohl sicher als auch schnell sind. Die .get()-Methode gibt eine einzelne Zeile zurück, während .all() ein Array aller übereinstimmenden Zeilen zurückgibt.
Arbeiten mit Transaktionen
Für Operationen, die gemeinsam erfolgreich sein oder fehlschlagen müssen, verwenden Sie Transaktionen:
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.
Erweiterte Bun SQLite-Funktionen
Verwendung von benannten Parametern
Benannte Parameter machen komplexe Abfragen lesbarer:
const query = db.prepare(`
SELECT * FROM users
WHERE name = $name AND email = $email
`)
const result = query.get({
$name: "Alice",
$email: "alice@example.com"
})
Umgang mit verschiedenen Rückgabetypen
Bun SQLite bietet mehrere Methoden zum Abrufen von Daten:
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()
Integration mit Drizzle ORM
Für größere Projekte bietet die Kombination von bun:sqlite mit Drizzle ORM Typsicherheit und eine bessere Developer Experience:
// 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)
Best Practices und Performance-Tipps
Verbindungen immer schließen
Obwohl Bun SQLite Datenbanken während der Garbage Collection automatisch schließt, ist das explizite Schließen eine gute Praxis:
// When done with the database
db.close()
Prepared Statements verwenden
Prepared Statements in Bun SQLite werden gecacht und wiederverwendet, was eine bessere Performance bei wiederholten Abfragen bietet:
// 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)
}
Den richtigen Speichermodus wählen
- Verwenden Sie dateibasierte Datenbanken (
Database("app.db")) für persistente Daten - Verwenden Sie In-Memory-Datenbanken (
Database(":memory:")) für Tests oder temporäre Daten - Verwenden Sie den Read-Only-Modus (
Database("data.db", { readonly: true })) für statische Datensätze
Fazit
Bun SQLite bietet alles, was Sie für lokale Datenbankoperationen ohne externe Abhängigkeiten benötigen. Egal, ob Sie ein CLI-Tool, einen API-Prototyp oder einen kleinen Produktionsservice entwickeln – das integrierte bun:sqlite-Modul bietet die perfekte Balance zwischen Einfachheit und Performance. Beginnen Sie mit der synchronen API für schnelle Skripte und fügen Sie dann Drizzle ORM hinzu, wenn Sie Typsicherheit und Migrationen benötigen. Mit nur wenigen Codezeilen haben Sie eine voll funktionsfähige SQL-Datenbank einsatzbereit.
Häufig gestellte Fragen (FAQs)
Bun SQLite verwendet SQLites Standard-Locking-Mechanismus, der mehrere Leser, aber nur einen Schreiber gleichzeitig unterstützt. Für intensive gleichzeitige Schreibvorgänge sollten Sie den WAL-Modus in Betracht ziehen, indem Sie db.run('PRAGMA journal_mode = WAL') nach dem Öffnen der Datenbank ausführen.
Bun SQLite ist in der Regel 2-3x schneller als Node.js SQLite-Bibliotheken aufgrund seiner nativen Implementierung und synchronen API. Die integrierte Natur eliminiert den JavaScript-zu-Native-Overhead, was es besonders effizient für lokale Datenbankoperationen macht.
Bun SQLite übernimmt die Limits von SQLite und unterstützt Datenbanken bis zu 281 Terabyte. In der Praxis bleibt die Performance für Datenbanken unter 100 GB hervorragend. Für größere Datensätze sollten Sie eine ordnungsgemäße Indizierung implementieren und PRAGMA-Optimierungen verwenden.
Ja, Bun SQLite ist produktionsreif für geeignete Anwendungsfälle wie Single-Server-Anwendungen, Desktop-Apps und Microservices. Für verteilte Systeme, die mehrere Schreibknoten erfordern, sollten Sie stattdessen PostgreSQL oder MySQL in Betracht ziehen.
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.