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" }
])
Discover how at OpenReplay.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.