Back

Краткое руководство: настройка Bun + SQLite

Краткое руководство: настройка Bun + SQLite

Нужна быстрая база данных без зависимостей для вашего проекта на Bun? Настройка Bun SQLite занимает всего несколько минут и предоставляет вам мощную локальную базу данных без внешних зависимостей или сложных конфигураций. Вот всё, что вам нужно знать для начала работы с bun:sqlite и интеграции в ваши проекты.

Ключевые моменты

  • Bun включает встроенный драйвер SQLite, не требующий установки npm-пакетов
  • Синхронный API обеспечивает высокую производительность для локальных баз данных
  • Подготовленные запросы (prepared statements) обеспечивают безопасность и скорость
  • Транзакции гарантируют целостность данных при многошаговых операциях

Начало работы с Bun SQLite

Встроенный модуль bun:sqlite предоставляет синхронный высокопроизводительный драйвер SQLite, который идеально подходит для локальной разработки, прототипов и небольших production-приложений. Никаких 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()

API Bun SQLite по умолчанию использует подготовленные запросы, делая ваши запросы одновременно безопасными и быстрыми. Метод .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: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 или небольшой production-сервис, встроенный модуль bun:sqlite предлагает идеальный баланс простоты и производительности. Начните с синхронного API для быстрых скриптов, затем добавьте Drizzle ORM, когда понадобится типобезопасность и миграции. Всего несколькими строками кода вы получаете полностью функциональную SQL-базу данных, готовую к работе.

Часто задаваемые вопросы

Bun SQLite использует стандартный механизм блокировки SQLite, который поддерживает несколько читателей, но только одного писателя одновременно. Для интенсивных конкурентных записей рассмотрите использование режима WAL, выполнив db.run('PRAGMA journal_mode = WAL') после открытия базы данных.

Bun SQLite обычно работает в 2-3 раза быстрее, чем библиотеки SQLite для Node.js, благодаря нативной реализации и синхронному API. Встроенная природа устраняет накладные расходы на взаимодействие JavaScript с нативным кодом, что делает его особенно эффективным для операций с локальной базой данных.

Bun SQLite наследует ограничения SQLite, поддерживая базы данных размером до 281 терабайта. На практике производительность остаётся отличной для баз данных размером до 100 ГБ. Для больших наборов данных рассмотрите внедрение правильной индексации и использование оптимизаций PRAGMA.

Да, Bun SQLite готов к production для соответствующих случаев использования, таких как одно-серверные приложения, десктопные приложения и микросервисы. Для распределённых систем, требующих несколько узлов записи, рассмотрите вместо этого 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