Archivos SQLite explicados: estructura, casos de uso y límites clave

Un archivo SQLite es un único archivo de disco que contiene una base de datos relacional completa: tablas, índices y esquema juntos. La propia documentación de SQLite lo llama el «archivo de base de datos principal» y señala que «el estado completo de una base de datos SQLite generalmente está contenido» en él. La palabra generalmente tiene un gran peso en esa frase.
Si alguna vez le han entregado un archivo .db, .sqlite o .sqlite3 y se ha preguntado si recibió todos los datos, este es el formato que debe comprender a fondo.
Qué es realmente un archivo SQLite
SQLite se describe a sí mismo como «una biblioteca en proceso que implementa un motor de base de datos SQL transaccional, autónomo, sin servidor y sin configuración». La misma página afirma que SQLite «no tiene un proceso de servidor independiente». Una aplicación vincula la biblioteca y lee el archivo.
De esto se derivan dos consecuencias. En primer lugar, la base de datos viaja como un único artefacto, razón por la cual tantas aplicaciones distribuyen sus datos de esta manera. En segundo lugar, el formato tiene que ser extremadamente estable, porque esos archivos sobreviven al software que los escribió. SQLite incluye un «formato de archivo estable y duradero» entre sus características principales. También afirma que el código es de dominio público, «libre para su uso para cualquier propósito, comercial o privado».
Es fácil subestimar la escala. La propia página de información de SQLite dice que «es la base de datos más implementada en el mundo con más aplicaciones de las que podemos contar».
Qué hay dentro del archivo
La cabecera de 100 bytes
Los primeros bytes identifican el formato. En el desplazamiento 0, el archivo lleva una cadena de cabecera de 16 bytes: SQLite format 3\000. Esa firma es la forma en que las herramientas reconocen el archivo independientemente de su extensión.
El siguiente campo importa más de lo que parece. En el desplazamiento 16 se encuentra un entero de 2 bytes que contiene «el tamaño de página de la base de datos en bytes». La documentación indica que «debe ser una potencia de dos entre 512 y 32768 inclusive, o el valor 1 que representa un tamaño de página de 65536». Todos los campos multibyte de la cabecera se almacenan con el byte más significativo primero.
Le siguen dos bytes más en los desplazamientos 18 y 19: la versión de escritura y la versión de lectura del formato de archivo. La documentación señala que el valor es «1 para el formato heredado; 2 para WAL».
Páginas, no filas
Debajo de la cabecera, el archivo es una pila de páginas de tamaño fijo. La especificación es explícita: «El archivo de base de datos principal consta de una o más páginas. El tamaño de una página es una potencia de dos entre 512 y 65536 inclusive. Todas las páginas dentro de la misma base de datos tienen el mismo tamaño».
Las páginas se numeran a partir del 1, y el número máximo de página es 4,294,967,294. Las tablas y los índices residen dentro de esas páginas como estructuras de árbol B (B-tree), razón por la cual un editor de texto le mostrará muy poco.
Los archivos adjuntos (sidecar) que nadie menciona
Esta es la parte que suele tomar a la gente por sorpresa. La documentación dice que el estado completo está «generalmente» en un solo archivo. Luego menciona la excepción. Durante una transacción, SQLite «almacena información adicional en un segundo archivo llamado 'rollback journal'». En modo WAL, ese segundo archivo es un registro de escritura anticipada (write-ahead log).
Por lo tanto, una copia realizada mientras la aplicación está a mitad de una escritura puede carecer de datos confirmados que aún residen en el archivo adjunto. Si un colega le envía un archivo .db y nada más, y los números parecen un poco desactualizados, esto es lo primero que debe verificar.
Cómo abrir un archivo SQLite
Hay tres vías, y la adecuada depende de lo que pretenda hacer a continuación.
Léalo con un visor. Los visores de SQLite para escritorio y basados en navegador abren el archivo, enumeran las tablas y le permiten hacer clic a través de las filas. Esta es la forma más rápida de responder a la pregunta «¿qué hay aquí dentro?», y suele ser suficiente para un primer vistazo.
Consúltelo con la línea de comandos o una biblioteca. El shell de sqlite3 y los enlaces de la biblioteca estándar en Python, Node y la mayoría de los demás lenguajes leen el formato directamente. Esta es la vía adecuada cuando ya conoce el esquema y desea obtener un número específico.
Exporte una tabla y analícela en otro lugar. Vuelque una tabla a CSV y llévela a cualquier herramienta que su equipo ya utilice. Perderá las relaciones entre las tablas, que es precisamente lo único que el formato protegía. Siempre que pueda, exporte el resultado combinado en lugar de las tablas sin procesar.
Por qué una herramienta podría decir que el archivo no es una base de datos
La especificación explica este punto. Cada archivo válido comienza con una cadena de cabecera de 16 bytes, SQLite format 3\000. Si un lector abre un archivo y no encuentra esa firma en el desplazamiento 0, significa que no se le ha entregado una base de datos SQLite.
Tres causas comunes cubren la mayoría de los casos. El archivo se transfirió de forma incompleta, por lo que la cabecera está ahí pero el resto está truncado. El archivo está cifrado o empaquetado por una aplicación, por lo que los primeros bytes son otra cosa. O bien la extensión es engañosa y lo que realmente recibió fue una exportación simple renombrada por alguien que intentaba ser de ayuda.
Qué tan grande puede llegar a ser un archivo SQLite
Más grande de lo que la pregunta suele dar a entender. La página de límites de SQLite indica que el tamaño máximo de un archivo de base de datos es de 4,294,967,294 páginas. Con el tamaño de página máximo de 65,536 bytes, eso equivale a un tamaño máximo de base de datos de aproximadamente 281 terabytes.
La página es sumamente honesta sobre esa cifra. Señala que el límite superior «no se ha probado ya que los desarrolladores no tienen acceso a hardware capaz de alcanzar este límite».
El recuento de filas está limitado por la misma barrera. El máximo teórico es de 2^64 filas en una tabla. La documentación señala que este límite «es inalcanzable ya que primero se alcanzará el tamaño máximo de base de datos de 281 terabytes».
Para el trabajo práctico, la conclusión útil es lo opuesto a un límite. Si alguien le entrega un archivo .db y le advierte que es grande, es casi seguro que el formato no será lo que lo detenga. El tamaño de página elegido al crear el archivo y si este contiene índices afectarán la experiencia mucho más que cualquier límite documentado.
Dónde se encuentran los archivos SQLite
- Exportaciones de aplicaciones. Las aplicaciones de escritorio y móviles a menudo almacenan el historial, la configuración y los registros de mensajes en un archivo SQLite que puede copiar.
- Entregas de análisis. Los ingenieros envían una instantánea como un único archivo en lugar de otorgar acceso a la base de datos.
- Dispositivos y telemetría. Los sistemas embebidos escriben localmente porque no hay un servidor con el que comunicarse.
- Archivos. La estabilidad a largo plazo del formato lo convierte en una opción común para conjuntos de datos que deben seguir siendo legibles durante años.
- Componentes internos del navegador y herramientas. Muchas herramientas locales mantienen el estado de esta manera, razón por la cual la extensión aparece en los tickets de soporte.
Para qué sirven los archivos WAL y journal
Es posible que haya copiado un archivo .db y haya encontrado un archivo -wal o -journal junto a él. Esos son los archivos adjuntos (sidecars) que describe la especificación, y eliminarlos es la forma en que la gente pierde datos.
El rollback journal es el mecanismo más antiguo. Antes de modificar una página, SQLite escribe la versión original de esa página en el journal. Si la escritura se interrumpe, la original se puede restaurar, que es lo que permite que una transacción sobreviva a una caída del sistema.
El registro de escritura anticipada (write-ahead log) invierte la disposición. Los cambios se guardan primero en el registro y el archivo principal se actualiza más tarde. La cabecera indica en qué modo se encuentra la base de datos. La versión de escritura del formato de archivo en el desplazamiento 18 es «1 para el formato heredado; 2 para WAL».
La regla práctica se deriva directamente de la frase sobre el estado completo. Suponga que la base de datos está en modo WAL y alguien le entrega únicamente el archivo principal. Es posible que los cambios confirmados más recientes aún se encuentren en el registro que no recibió.
Por lo tanto, cuando le entreguen un archivo de base de datos, haga dos preguntas: ¿Se cerró la aplicación de forma limpia cuando se realizó la copia? y ¿venía algo más con ella? Ambas respuestas suelen ser afirmativas, y la única vez que no lo son es cuando los números discrepan silenciosamente con los de producción.
Archivo SQLite frente a CSV frente a Parquet
| Archivo SQLite | CSV | Parquet | |
|---|---|---|---|
| Estructura | Varias tablas, un solo archivo | Una tabla, un solo archivo | Una tabla, un solo archivo o carpeta |
| Tipos | Almacenados con los datos | Inferidos por el lector | Almacenados con los datos |
| Relaciones | Conservadas, mediante claves e índices | Perdidas | Perdidas |
| Legible por humanos | No | Sí | No |
| Diseñado para ser consultado | Sí, con SQL | No | Sí, por motores de análisis |
| Fallo común | Falta del archivo adjunto journal o WAL | Conjetura de tipos y delimitadores | Soporte de la cadena de herramientas (toolchain) |
Si trabaja con estos formatos habitualmente, nuestras guías explicativas sobre archivos Parquet y archivos TSV cubren the mismo terreno para esos dos.
Por qué los equipos eligen este formato
Nada que ejecutar. Debido a que SQLite «no tiene un proceso de servidor independiente», una entrega es simplemente una copia de archivo en lugar de un ticket de aprovisionamiento.
Los tipos sobreviven al viaje. Una columna de fecha llega como una fecha. Cualquiera que haya visto cómo un lector de CSV convierte un identificador en notación científica comprende el valor de esto.
Las relaciones también sobreviven. Varias tablas relacionadas permanecen juntas en un solo artefacto, por lo que las combinaciones (joins) que daban sentido a los datos siguen estando disponibles.
La durabilidad está integrada en el diseño. SQLite incluye las transacciones «incluso después de una pérdida de energía» entre sus características principales, razón por la cual gran parte del software embebido confía en él.
Límites que vale la pena conocer
Un archivo, un único escritor a la vez. El motor está embebido en lugar de servido, por lo que el modelo de concurrencia es diferente al de una base de datos cliente-servidor. Esta es una elección de diseño, no un defecto, pero define para qué es útil el archivo.
El tamaño de página se fija en la creación. Cada página de una base de datos tiene el mismo tamaño, y ese tamaño se registra en la cabecera. Se elige una sola vez.
De nuevo, la regla del archivo adjunto. Cualquier rutina de copia, respaldo o carga que solo tome el archivo principal puede omitir lo que estuviera en el journal o en el registro de escritura anticipada (write-ahead log).
Opacidad. Un archivo SQLite no se puede ojear de la misma manera que un CSV. Leerlo requiere una herramienta, que es exactamente la fricción que frena muchos análisis.
Cómo obtener respuestas de un archivo SQLite
La vía tradicional consiste en instalar un cliente, abrir el archivo, conocer el esquema y comenzar a escribir SQL. Eso está bien cuando ya conoce las tablas. Pero resulta lento cuando le entregaron el archivo esta mañana y la reunión es esta tarde.
La vía más corta es hacer la pregunta directamente. Powerdrill Bloom le permite trabajar con sus datos en lenguaje natural y devuelve una respuesta con su fuente adjunta. La página de inicio promete que «cada número regresa con la página, la fila y la cifra que lo respalda». Desde allí, el mismo espacio de trabajo puede generar gráficos, hojas de cálculo o una breve presentación.
Vale la pena conocer dos páginas relacionadas si este es su flujo de trabajo habitual. Chat with Database cubre la vía conversacional para acceder a datos estructurados, y Text to SQL cubre el caso en el que desea obtener la consulta en sí. Si, por el contrario, su entrega llega como una exportación plana, la página del CSV AI assistant cubre ese camino.
Una cosa más que le indica la cabecera
Debido a que el tamaño de página reside en un desplazamiento fijo, puede aprender algo útil sobre un archivo antes de abrirlo correctamente. Una base de datos creada con una página de 4,096 bytes se comporta de manera diferente a una creada con páginas de 65,536 bytes. Esa elección se tomó una sola vez, cuando se creó el archivo.
No es un número que se cambie casualmente después. Pertenece a la misma categoría mental que una decisión de esquema, en lugar de ser un simple ajuste.
Conclusión
Un archivo SQLite es una base de datos completa en un solo artefacto. Contiene una firma de 16 bytes, un tamaño de página registrado en el desplazamiento 16 y una pila de páginas de tamaño fijo que albergan sus tablas e índices. Se transporta fácilmente, conserva sus tipos y sigue siendo legible durante años.
Recuerde la única advertencia con la que la especificación es cuidadosa. El estado completo suele estar en ese archivo. Durante una transacción, parte de él reside en un rollback journal o en un registro de escritura anticipada (write-ahead log) junto a él. Busque el archivo adjunto antes de confiar en la copia.
Cuando tenga el archivo y necesite la respuesta en lugar del esquema, pruebe Powerdrill Bloom y haga su pregunta directamente sobre los datos.
Preguntas frecuentes
¿Cuál es la diferencia entre .db, .sqlite y .sqlite3?
Nada estructural. Las tres son extensiones convencionales para el mismo formato, y el identificador real es la cadena de cabecera de 16 bytes SQLite format 3\000 al inicio del archivo.
¿Cómo sé qué tamaño de página utiliza un archivo SQLite?
Está registrado en la cabecera. Un entero de 2 bytes en el desplazamiento 16 contiene el tamaño de página en bytes. Debe ser una potencia de dos entre 512 y 32768, o el valor 1 que representa 65536.
¿Es un archivo SQLite la base de datos completa?
Generalmente, pero no siempre. La documentación indica que durante una transacción SQLite guarda información adicional en un rollback journal. En modo WAL, esa información se dirige en su lugar a un registro de escritura anticipada (write-ahead log).
¿Puedo abrir un archivo SQLite en Excel?
No directamente, porque el archivo almacena páginas de árbol B (B-tree) en lugar de filas de texto. El camino habitual es exportar primero una tabla a CSV, o utilizar una herramienta que lea el formato de la base de datos y devuelva los resultados.
¿Es SQLite gratuito para uso comercial?
Sí. SQLite afirma que su código es de dominio público y es «libre para su uso para cualquier propósito, comercial o privado».