Back

Guía Rápida: Configuración de Bun + SQLite

Guía Rápida: Configuración de Bun + SQLite

¿Necesitas una base de datos rápida y sin dependencias para tu proyecto Bun? Configurar Bun SQLite toma solo minutos y te proporciona una potente base de datos local sin dependencias externas ni configuraciones complejas. Aquí encontrarás todo lo que necesitas para comenzar con bun:sqlite e integrarlo en tus proyectos.

Puntos Clave

  • Bun incluye un driver SQLite integrado que no requiere paquetes npm
  • La API síncrona proporciona alto rendimiento para bases de datos locales
  • Las sentencias preparadas ofrecen beneficios tanto de seguridad como de velocidad
  • Las transacciones garantizan la integridad de datos para operaciones de múltiples pasos

Primeros Pasos con Bun SQLite

El módulo integrado bun:sqlite proporciona un driver SQLite síncrono y de alto rendimiento que es perfecto para desarrollo local, prototipos y aplicaciones de producción pequeñas. No se requieren paquetes npm—ya es parte de Bun.

Conexión Básica a la Base de Datos

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:")

Eso es todo—ahora tienes una conexión funcional a una base de datos Bun SQLite. El archivo de base de datos se crea automáticamente si no existe.

Ejecutando tus Primeras Consultas con bun:sqlite

Creación de Tablas y Operaciones Básicas

// 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()

La API de Bun SQLite utiliza sentencias preparadas por defecto, haciendo tus consultas seguras y rápidas. El método .get() devuelve una única fila, mientras que .all() devuelve un array con todas las filas coincidentes.

Trabajando con Transacciones

Para operaciones que necesitan tener éxito o fallar juntas, utiliza transacciones:

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" }
])

Características Avanzadas de Bun SQLite

Uso de Parámetros Nombrados

Los parámetros nombrados hacen que las consultas complejas sean más legibles:

const query = db.prepare(`
  SELECT * FROM users 
  WHERE name = $name AND email = $email
`)

const result = query.get({
  $name: "Alice",
  $email: "alice@example.com"
})

Manejo de Diferentes Tipos de Retorno

Bun SQLite ofrece múltiples métodos para recuperar datos:

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()

Integración con Drizzle ORM

Para proyectos más grandes, combinar bun:sqlite con Drizzle ORM proporciona seguridad de tipos y una mejor experiencia de desarrollo:

// 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)

Mejores Prácticas y Consejos de Rendimiento

Siempre Cierra las Conexiones

Aunque Bun SQLite cierra automáticamente las bases de datos durante la recolección de basura, cerrarlas explícitamente es una buena práctica:

// When done with the database
db.close()

Utiliza Sentencias Preparadas

Las sentencias preparadas en Bun SQLite se almacenan en caché y se reutilizan, ofreciendo mejor rendimiento para consultas repetidas:

// 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)
}

Elige el Modo de Almacenamiento Adecuado

  • Utiliza bases de datos basadas en archivos (Database("app.db")) para datos persistentes
  • Utiliza bases de datos en memoria (Database(":memory:")) para pruebas o datos temporales
  • Utiliza modo de solo lectura (Database("data.db", { readonly: true })) para conjuntos de datos estáticos

Conclusión

Bun SQLite proporciona todo lo que necesitas para operaciones de base de datos locales sin dependencias externas. Ya sea que estés construyendo una herramienta CLI, un prototipo de API o un pequeño servicio de producción, el módulo integrado bun:sqlite ofrece el equilibrio perfecto entre simplicidad y rendimiento. Comienza con la API síncrona para scripts rápidos, y luego añade Drizzle ORM cuando necesites seguridad de tipos y migraciones. Con solo unas pocas líneas de código, tienes una base de datos SQL completamente funcional lista para usar.

Preguntas Frecuentes

Bun SQLite utiliza el mecanismo de bloqueo predeterminado de SQLite que soporta múltiples lectores pero solo un escritor a la vez. Para escrituras concurrentes intensivas, considera usar el modo WAL ejecutando db.run('PRAGMA journal_mode = WAL') después de abrir la base de datos.

Bun SQLite típicamente funciona de 2 a 3 veces más rápido que las bibliotecas SQLite de Node.js debido a su implementación nativa y API síncrona. Su naturaleza integrada elimina la sobrecarga de JavaScript a nativo, haciéndolo particularmente eficiente para operaciones de base de datos locales.

Bun SQLite hereda los límites de SQLite, soportando bases de datos de hasta 281 terabytes. En la práctica, el rendimiento permanece excelente para bases de datos menores a 100GB. Para conjuntos de datos más grandes, considera implementar indexación adecuada y usar optimizaciones PRAGMA.

Sí, Bun SQLite está listo para producción en casos de uso apropiados como aplicaciones de un solo servidor, aplicaciones de escritorio y microservicios. Para sistemas distribuidos que requieren múltiples nodos de escritura, considera PostgreSQL o MySQL en su lugar.

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