12k
All articles

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

Быстрая настройка Bun SQLite через модуль bun:sqlite: выполнение запросов, управление транзакциями и интеграция Drizzle ORM для типобезопасной работы с БД.

OpenReplay Team
OpenReplay Team
Краткое руководство: настройка 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 обрабатывать конкурентный доступ к базе данных из нескольких процессов?

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

Как производительность Bun SQLite сравнивается с библиотеками SQLite для Node.js?

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

Какой максимальный размер базы данных может обработать Bun SQLite?

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

Безопасно ли использовать Bun SQLite в production-приложениях?

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