Funcionalidades modernas de SQLite que quizás te estés perdiendo
Si todavía piensas en SQLite como una base de datos ligera, apta solo para aplicaciones móviles o prototipos rápidos, te has perdido varios años de desarrollo significativo. SQLite se mantiene activamente, incorpora capacidades que rivalizan con bases de datos más pesadas para muchas cargas de trabajo y ahora se ejecuta directamente en el navegador. Esto es lo que vale la pena conocer.
Puntos clave
- El almacenamiento JSONB ofrece un formato binario compacto que se analiza más rápido que el JSON en texto, y las expresiones JSON pueden indexarse directamente.
- Las tablas STRICT aportan una verdadera aplicación de tipos a SQLite, cerrando una brecha histórica con bases de datos como PostgreSQL.
- La cláusula RETURNING elimina la necesidad de un SELECT posterior tras operaciones INSERT, UPDATE o DELETE.
- La compilación oficial de SQLite WASM con persistencia OPFS convierte las bases de datos residentes en el navegador en una opción arquitectónica práctica.
- El modo WAL mejora la concurrencia de lectura/escritura con una sola declaración PRAGMA.
Soporte para JSON y JSONB: más que simple almacenamiento de texto
SQLite ha tenido funciones JSON durante años, pero una incorporación más reciente es el soporte para JSONB, un formato binario que almacena documentos de forma más compacta y se analiza más rápido que el JSON en texto plano.
Cuando usas jsonb() para almacenar datos, SQLite evita volver a analizar el texto en cada lectura. Para cargas de trabajo con muchas lecturas y grandes payloads JSON, esto importa.
CREATE TABLE events (
id INTEGER PRIMARY KEY,
payload BLOB NOT NULL -- store as JSONB
);
-- Insert using jsonb()
INSERT INTO events (payload)
VALUES (jsonb('{"user": {"id": 42}, "action": "login"}'));
-- Query with standard json_extract — works on JSONB columns too
SELECT json_extract(payload, '$.user.id') AS user_id
FROM events
WHERE json_extract(payload, '$.action') = 'login';
Las funciones JSON de SQLite aceptan tanto valores JSON en texto como JSONB de forma transparente, por lo que puedes seguir usando funciones como json_extract() independientemente del formato de almacenamiento.
También puedes indexar expresiones JSON directamente, lo que hace que filtrar por campos anidados sea rápido sin necesidad de desnormalizar tu esquema:
CREATE INDEX idx_action ON events (json_extract(payload, '$.action'));
Cuándo usar JSONB vs TEXT: Usa
BLOB+jsonb()cuando SQLite vaya a procesar o consultar el valor JSON con frecuencia. UsaTEXTcuando necesites preservar la cadena original exactamente como fue insertada.
⚠️ Nota sobre versiones: El soporte para JSONB se introdujo en SQLite 3.45 (enero de 2024). Confirma la versión de tu entorno antes de depender de él.
Tablas STRICT en SQLite: aplicación real de tipos
La tipificación flexible de SQLite es útil, pero puede introducir errores sutiles cuando una columna acepta silenciosamente un tipo incorrecto. Las tablas STRICT solucionan esto aplicando los tipos de columna en el momento de la inserción, de forma similar a como se comporta PostgreSQL.
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL,
age INTEGER NOT NULL
) STRICT;
Intenta insertar 'twenty-five' en age y SQLite lo rechazará. Las tablas STRICT admiten cinco tipos de columna permitidos: INT, INTEGER, REAL, TEXT, BLOB, además del tipo especial ANY. El tipo ANY reactiva el comportamiento flexible normal de SQLite para esa columna, de modo que puedes combinar columnas estrictas y flexibles en la misma tabla.
⚠️ Comprueba tu versión primero: Las tablas STRICT requieren SQLite 3.37 o posterior. Ejecuta
SELECT sqlite_version();para confirmarlo.
La cláusula RETURNING: consultas de mutación más limpias
Si alguna vez has insertado una fila y luego la has consultado inmediatamente para obtener el ID generado, RETURNING elimina ese viaje de ida y vuelta:
INSERT INTO orders (user_id, total)
VALUES (42, 99.99)
RETURNING id, created_at;
Funciona en INSERT, UPDATE y DELETE, y resulta especialmente útil en JavaScript del lado del servidor con bibliotecas como better-sqlite3 o el SQLite integrado de Bun. RETURNING se añadió en SQLite 3.35.
Discover how at OpenReplay.com.
SQLite WASM: ejecutando SQLite directamente en el navegador
El proyecto SQLite distribuye una compilación oficial en WebAssembly que ejecuta el motor completo de SQLite en una pestaña del navegador. A diferencia de sql.js, que la precede, la compilación oficial de SQLite WASM admite la API Origin Private File System (OPFS) para almacenamiento persistente respaldado por archivos, lo que significa que tu base de datos sobrevive a las recargas de página sin necesidad de un servidor.
Esto abre la puerta a una verdadera arquitectura para el desarrollo frontend con SQLite:
- Aplicaciones offline-first que consultan localmente y sincronizan después
- Herramientas de análisis o generación de informes del lado del cliente
- Aplicaciones Electron y Tauri que buscan una única abstracción de base de datos en distintos entornos
- Herramientas de desarrollo basadas en navegador con capacidad real de consulta
OPFS está documentado por MDN como parte de la API File System, y la guía de web.dev de Google indica que es compatible con todos los navegadores principales. Algunas configuraciones de SQLite WASM respaldadas por OPFS también requieren un contexto seguro (HTTPS), soporte para SharedArrayBuffer y cabeceras COOP/COEP apropiadas, según la implementación de VFS que elijas.
Modo WAL: mejor concurrencia sin sobrecarga de configuración
El registro write-ahead permite que lectores y escritores trabajen de forma concurrente sin bloquearse entre sí. Para aplicaciones con lecturas y escrituras concurrentes, o donde la latencia percibida importa, vale la pena habilitar el modo WAL:
PRAGMA journal_mode = WAL;
Este único pragma puede mejorar significativamente el rendimiento en aplicaciones local-first, aplicaciones Electron y servicios backend ligeros donde SQLite gestiona tráfico real. Ten en cuenta que el modo WAL requiere que el archivo de base de datos resida en disco local, ya que no funciona de forma fiable sobre sistemas de archivos en red.
Conclusión
Las funcionalidades modernas de SQLite, como JSONB, las tablas STRICT, RETURNING, WASM con OPFS y el modo WAL, en conjunto convierten a SQLite en una opción creíble para una gama mucho más amplia de aplicaciones de lo que sugiere su reputación. El proyecto se desarrolla activamente, y la brecha entre SQLite y bases de datos más pesadas se ha reducido considerablemente para cargas de trabajo que no requieren concurrencia de múltiples escritores a gran escala. Si no has revisado recientemente lo que SQLite puede hacer, este es un buen momento.
Preguntas frecuentes
Sí, para muchas cargas de trabajo. SQLite gestiona bien el tráfico con muchas lecturas y volúmenes de escritura pequeños o medianos, especialmente con el modo WAL habilitado. Funciona mejor para despliegues en un único servidor o aplicaciones local-first. Para aplicaciones que requieren múltiples escritores concurrentes en servidores distribuidos, una base de datos cliente-servidor como PostgreSQL sigue siendo la mejor opción.
Elige JSONB cuando SQLite vaya a procesar o consultar el valor JSON con frecuencia, ya que evita el reanálisis en cada lectura y almacena los datos de forma más compacta. Quédate con TEXT cuando necesites preservar la cadena original exactamente como fue escrita, incluyendo espacios en blanco y orden de claves, lo cual importa para firmas criptográficas o registros de auditoría.
No. STRICT es opcional por tabla, por lo que las tablas existentes continúan usando la tipificación flexible de SQLite. Puedes introducir tablas STRICT en nuevos esquemas o migrar tablas específicas gradualmente. Solo asegúrate de estar ejecutando SQLite 3.37 o posterior antes de añadir la palabra clave STRICT a cualquier sentencia CREATE TABLE.
El rendimiento es cercano pero no idéntico. La compilación WASM se ejecuta más lentamente que SQLite nativo debido a la sobrecarga de WebAssembly y a que el acceso a archivos OPFS es menos directo que la E/S de disco nativa. Para muchas cargas de trabajo modestas del lado del cliente, la diferencia es aceptable, pero los grandes conjuntos de datos y las consultas analíticas pesadas aún pueden mostrar ralentizaciones notables.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.